main.c revision 5377c5bfde6ba62490417bb0a7d7c1be1151692e
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 51fc8ed80ba1362d2ce500003625e1c9c39f765661Xavier Ducrohet#include "android/qemulator.h" 52055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner#include "android/display.h" 530119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine 54ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije#include "android/snapshot.h" 55ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije 56e3fdd075ed97085b4201cb0c79609633b19bddccDavid 'Digit' Turner#include "android/framebuffer.h" 579a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine#include "iolooper.h" 58055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner 59334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima#ifdef TARGET_I386 60334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajimanand_threshold android_nand_read_threshold; 61334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajimanand_threshold android_nand_write_threshold; 62334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima#endif 63334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectAndroidRotation android_framebuffer_rotation; 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define STRINGIFY(x) _STRINGIFY(x) 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define _STRINGIFY(x) #x 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 69a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner#ifdef ANDROID_SDK_TOOLS_REVISION 70a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner# define VERSION_STRING STRINGIFY(ANDROID_SDK_TOOLS_REVISION)".0" 71a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner#else 72a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner# define VERSION_STRING "standalone" 73a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner#endif 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define D(...) do { if (VERBOSE_CHECK(init)) dprint(__VA_ARGS__); } while (0) 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern int control_console_start( int port ); /* in control.c */ 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern int qemu_milli_needed; 808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* the default device DPI if none is specified by the skin 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define DEFAULT_DEVICE_DPI 165 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if 0 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int opts->flashkeys; /* forward */ 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_TRACE 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void start_tracing(void); 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void stop_tracing(void); 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectunsigned long android_verbose; 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint qemu_main(int argc, char **argv); 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* this function dumps the QEMU help */ 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void help( void ); 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void emulator_help( void ); 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define VERBOSE_OPT(str,var) { str, &var } 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define _VERBOSE_TAG(x,y) { #x, VERBOSE_##x, y }, 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const struct { const char* name; int flag; const char* text; } 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectverbose_options[] = { 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project VERBOSE_TAG_LIST 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 0, 0, 0 } 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid emulator_help( void ) 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project STRALLOC_DEFINE(out); 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_help_main(out); 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf( "%.*s", out->n, out->s ); 1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project stralloc_reset(out); 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* this function is used to perform auto-detection of the 1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * system directory in the case of a SDK installation. 1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * we want to deal with several historical usages, hence 1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * the slightly complicated logic. 1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * NOTE: the function returns the path to the directory 1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * containing 'fileName'. this is *not* the full 1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * path to 'fileName'. 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic char* 1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project_getSdkImagePath( const char* fileName ) 1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char temp[MAX_PATH]; 1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* p = temp; 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end = p + sizeof(temp); 1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* q; 1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* app; 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static const char* const searchPaths[] = { 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "", /* program's directory */ 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "/lib/images", /* this is for SDK 1.0 */ 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "/../platforms/android-1.1/images", /* this is for SDK 1.1 */ 1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL 1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project }; 1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project app = bufprint_app_dir(temp, end); 1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (app >= end) 1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do { 1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* first search a few well-known paths */ 1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; searchPaths[nn] != NULL; nn++) { 1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(app, end, "%s", searchPaths[nn]); 1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project q = bufprint(p, end, "/%s", fileName); 1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (q < end && path_exists(temp)) { 1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *p = 0; 1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto FOUND_IT; 1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* hmmm. let's assume that we are in a post-1.1 SDK 1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * scan ../platforms if it exists 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(app, end, "/../platforms"); 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p < end) { 1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project DirScanner* scanner = dirScanner_new(temp); 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (scanner != NULL) { 1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int found = 0; 1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* subdir; 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (;;) { 1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project subdir = dirScanner_next(scanner); 1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!subdir) break; 1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project q = bufprint(p, end, "/%s/images/%s", subdir, fileName); 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (q >= end || !path_exists(temp)) 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project continue; 1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project found = 1; 1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, "/%s/images", subdir); 1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dirScanner_free(scanner); 1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (found) 1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* I'm out of ideas */ 1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } while (0); 1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectFOUND_IT: 1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project //D("image auto-detection: %s/%s", temp, fileName); 19818fe86e8245878f3b7a2813bd59b8cfcf636e15cDavid 'Digit' Turner return android_strdup(temp); 1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic char* 2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project_getSdkImage( const char* path, const char* file ) 2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char temp[MAX_PATH]; 2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char *p = temp, *end = p + sizeof(temp); 2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(temp, end, "%s/%s", path, file); 2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p >= end || !path_exists(temp)) 2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21118fe86e8245878f3b7a2813bd59b8cfcf636e15cDavid 'Digit' Turner return android_strdup(temp); 2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic char* 2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project_getSdkSystemImage( const char* path, const char* optionName, const char* file ) 2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* image = _getSdkImage(path, file); 2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (image == NULL) { 2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror("Your system directory is missing the '%s' image file.\n" 2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Please specify one with the '%s <filepath>' option", 2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project file, optionName); 2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return image; 2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 2295389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine_forceAvdImagePath( AvdImageType imageType, 2305389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine const char* path, 2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* description, 2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int required ) 2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path == NULL) 2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (required && !path_exists(path)) { 2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror("Cannot find %s image file: %s", description, path); 2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdParams->forcePaths[imageType] = path; 2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 244cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turnerstatic uint64_t 245cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner_adjustPartitionSize( const char* description, 246cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner uint64_t imageBytes, 247cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner uint64_t defaultBytes, 248cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner int inAndroidBuild ) 249cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner{ 250cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner char temp[64]; 251cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner unsigned imageMB; 252cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner unsigned defaultMB; 253cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 254cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (imageBytes <= defaultBytes) 255cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner return defaultBytes; 256cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 257cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner imageMB = convertBytesToMB(imageBytes); 258cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner defaultMB = convertBytesToMB(defaultBytes); 259cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 260cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (imageMB > defaultMB) { 261cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner snprintf(temp, sizeof temp, "(%d MB > %d MB)", imageMB, defaultMB); 262cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } else { 263fc8ed80ba1362d2ce500003625e1c9c39f765661Xavier Ducrohet snprintf(temp, sizeof temp, "(%lld bytes > %lld bytes)", imageBytes, defaultBytes); 264cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 265cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 266def0e542c9cc004a7b83ff965103c34097c0960bDavid 'Digit' Turner if (inAndroidBuild) { 267def0e542c9cc004a7b83ff965103c34097c0960bDavid 'Digit' Turner dwarning("%s partition size adjusted to match image file %s\n", description, temp); 268cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 269cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 270cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner return convertMBToBytes(imageMB); 271cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner} 272cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint main(int argc, char **argv) 2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char tmp[MAX_PATH]; 2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* tmpend = tmp + sizeof(tmp); 2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* args[128]; 2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int n; 2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* opt; 2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int use_sdcard_img = 0; 2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int serial = 0; 2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int gps_serial = 0; 2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int radio_serial = 0; 2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int qemud_serial = 0; 2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int shell_serial = 0; 2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned cachePartitionSize = 0; 287cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner unsigned systemPartitionSize = 0; 288cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner unsigned dataPartitionSize = 0; 28949dcc4de79c93de65c20706b798353be1e840915David 'Digit' Turner unsigned defaultPartitionSize = convertMBToBytes(66); 2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AndroidHwConfig* hw; 292cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner AvdInfo* avd; 29374d7acec6643694132a127feb5ccadda7ea793d6David 'Digit' Turner AConfig* skinConfig; 29474d7acec6643694132a127feb5ccadda7ea793d6David 'Digit' Turner char* skinPath; 2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project //const char *appdir = get_app_dir(); 2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* android_build_root = NULL; 2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* android_build_out = NULL; 2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AndroidOptions opts[1]; 301b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine /* net.shared_net_ip boot property value. */ 302b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine char boot_prop_ip[64]; 303b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine boot_prop_ip[0] = '\0'; 3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[0] = argv[0]; 3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( android_parse_options( &argc, &argv, opts ) < 0 ) { 3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (argc-- > 1) { 3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opt = (++argv)[0]; 3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(!strcmp(opt, "-qemu")) { 3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project argc--; 3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project argv++; 3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strcmp(opt, "-help")) { 3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator_help(); 3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strncmp(opt, "-help-",6)) { 3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project STRALLOC_DEFINE(out); 3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opt += 6; 3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strcmp(opt, "all")) { 3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_help_all(out); 3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (android_help_for_option(opt, out) == 0) { 3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* ok */ 3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (android_help_for_topic(opt, out) == 0) { 3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* ok */ 3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (out->n > 0) { 3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf("\n%.*s", out->n, out->s); 3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(0); 3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "unknown option: -help-%s\n", opt); 3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "please use -help for a list of valid topics\n"); 3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opt[0] == '-') { 3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "unknown option: %s\n", opt); 3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "please use -help for a list of valid options\n"); 3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "invalid command-line parameter: %s.\n", opt); 3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "Hint: use '@foo' to launch a virtual device named 'foo'.\n"); 3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "please use -help for more information\n"); 3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->version) { 3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf("Android emulator version %s\n" 3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Copyright (C) 2006-2008 The Android Open Source Project and many others.\n" 3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "This program is a derivative of the QEMU CPU emulator (www.qemu.org).\n\n", 3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined ANDROID_BUILD_ID 3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project VERSION_STRING " (build_id " STRINGIFY(ANDROID_BUILD_ID) ")" ); 3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project VERSION_STRING); 3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf(" This software is licensed under the terms of the GNU General Public\n" 3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " License version 2, as published by the Free Software Foundation, and\n" 3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " may be copied, distributed, and modified under those terms.\n\n" 3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " This program is distributed in the hope that it will be useful,\n" 3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " but WITHOUT ANY WARRANTY; without even the implied warranty of\n" 3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" 3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " GNU General Public License for more details.\n\n"); 3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(0); 3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 37974d7acec6643694132a127feb5ccadda7ea793d6David 'Digit' Turner if (android_charmap_setup(opts->charmap)) { 38074d7acec6643694132a127feb5ccadda7ea793d6David 'Digit' Turner exit(1); 3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* legacy support: we used to use -system <dir> and -image <file> 3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * instead of -sysdir <dir> and -system <file>, so handle this by checking 3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * whether the options point to directories or files. 3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->image != NULL) { 3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->system != NULL) { 3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->sysdir != NULL) { 3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "You can't use -sysdir, -system and -image at the same time.\n" 3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "You should probably use '-sysdir <path> -system <file>'.\n" ); 3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dwarning( "Please note that -image is obsolete and that -system is now used to point\n" 3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "to the system image. Next time, try using '-sysdir <path> -system <file>' instead.\n" ); 3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->sysdir = opts->system; 3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->system = opts->image; 3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->image = NULL; 4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (opts->system != NULL && path_is_dir(opts->system)) { 4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->sysdir != NULL) { 4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "Option -system should now be followed by a file path, not a directory one.\n" 4048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Please use '-sysdir <path>' to point to the system directory.\n" ); 4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dwarning( "Please note that the -system option should now be used to point to the initial\n" 4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "system image (like the obsolete -image option). To point to the system directory\n" 4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "please now use '-sysdir <path>' instead.\n" ); 4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->sysdir = opts->system; 4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->system = NULL; 4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->nojni) 4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->no_jni = opts->nojni; 4178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->nocache) 4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->no_cache = opts->nocache; 4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->noaudio) 4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->no_audio = opts->noaudio; 4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->noskin) 4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->no_skin = opts->noskin; 4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* If no AVD name was given, try to find the top of the 4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Android build tree 4298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->avd == NULL) { 4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do { 4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* out = getenv("ANDROID_PRODUCT_OUT"); 4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (out == NULL || out[0] == 0) 4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!path_exists(out)) { 4389877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project derror("Can't access ANDROID_PRODUCT_OUT as '%s'\n" 4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "You need to build the Android system before launching the emulator", 4408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project out); 4418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_build_root = path_parent( out, 4 ); 4458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (android_build_root == NULL || !path_exists(android_build_root)) { 4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror("Can't find the Android build root from '%s'\n" 4478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Please check the definition of the ANDROID_PRODUCT_OUT variable.\n" 4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "It should point to your product-specific build output directory.\n", 4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project out ); 4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_build_out = out; 4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "found Android build root: %s", android_build_root ); 4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "found Android build out: %s", android_build_out ); 4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } while (0); 4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* if no virtual device name is given, and we're not in the 4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Android build system, we'll need to perform some auto-detection 4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * magic :-) 4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 4615389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (opts->avd == NULL && !android_build_out) 4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char dataDirIsSystem = 0; 4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->sysdir) { 4668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->sysdir = _getSdkImagePath("system.img"); 4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->sysdir) { 4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( 4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "You did not specify a virtual device name, and the system\n" 4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "directory could not be found.\n\n" 4718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "If you are an Android SDK user, please use '@<name>' or '-avd <name>'\n" 4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "to start a given virtual device (see -help-avd for details).\n\n" 4738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Otherwise, follow the instructions in -help-disk-images to start the emulator\n" 4758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ); 4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 4778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -sysdir %s", opts->sysdir); 4798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->system) { 4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->system = _getSdkSystemImage(opts->sysdir, "-image", "system.img"); 4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -image %s", opts->image); 4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->kernel) { 4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->kernel = _getSdkSystemImage(opts->sysdir, "-kernel", "kernel-qemu"); 4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -kernel %s", opts->kernel); 4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->ramdisk) { 4928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->ramdisk = _getSdkSystemImage(opts->sysdir, "-ramdisk", "ramdisk.img"); 4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -ramdisk %s", opts->ramdisk); 4948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* if no data directory is specified, use the system directory */ 4978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->datadir) { 49818fe86e8245878f3b7a2813bd59b8cfcf636e15cDavid 'Digit' Turner opts->datadir = android_strdup(opts->sysdir); 4998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dataDirIsSystem = 1; 5008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -datadir %s", opts->sysdir); 5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->data) { 5048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* check for userdata-qemu.img in the data directory */ 5058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint(tmp, tmpend, "%s/userdata-qemu.img", opts->datadir); 5068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!path_exists(tmp)) { 5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( 5088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "You did not provide the name of an Android Virtual Device\n" 5098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "with the '-avd <name>' option. Read -help-avd for more information.\n\n" 5108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "If you *really* want to *NOT* run an AVD, consider using '-data <file>'\n" 5128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "to specify a data partition image file (I hope you know what you're doing).\n" 5138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ); 5148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 5158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 51718fe86e8245878f3b7a2813bd59b8cfcf636e15cDavid 'Digit' Turner opts->data = android_strdup(tmp); 5188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -data %s", opts->data); 5198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->sdcard && opts->datadir) { 5228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint(tmp, tmpend, "%s/sdcard.img", opts->datadir); 5238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path_exists(tmp)) { 52418fe86e8245878f3b7a2813bd59b8cfcf636e15cDavid 'Digit' Turner opts->sdcard = android_strdup(tmp); 5258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -sdcard %s", opts->sdcard); 5268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 528353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije 529353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije#if CONFIG_ANDROID_SNAPSHOTS 530353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije if (!opts->snapstorage && opts->datadir) { 531353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije bufprint(tmp, tmpend, "%s/snapshots.img", opts->datadir); 532353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije if (path_exists(tmp)) { 533ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije opts->snapstorage = android_strdup(tmp); 534353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije D("autoconfig: -snapstorage %s", opts->snapstorage); 535353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 536353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 537ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije#endif // CONFIG_ANDROID_SNAPSHOTS 5388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* setup the virtual device parameters from our options 5418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 5428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->no_cache) { 5438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdParams->flags |= AVDINFO_NO_CACHE; 5448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->wipe_data) { 5468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdParams->flags |= AVDINFO_WIPE_DATA | AVDINFO_WIPE_CACHE; 5478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 548353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije#if CONFIG_ANDROID_SNAPSHOTS 549353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije if (opts->no_snapstorage) { 550353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije android_avdParams->flags |= AVDINFO_NO_SNAPSHOTS; 551353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 552353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije#endif 5538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* if certain options are set, we can force the path of 5558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * certain kernel/disk image files 5568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 557353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije _forceAvdImagePath(AVD_IMAGE_KERNEL, opts->kernel, "kernel", 1); 558353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije _forceAvdImagePath(AVD_IMAGE_INITSYSTEM, opts->system, "system", 1); 559353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije _forceAvdImagePath(AVD_IMAGE_RAMDISK, opts->ramdisk, "ramdisk", 1); 560353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije _forceAvdImagePath(AVD_IMAGE_USERDATA, opts->data, "user data", 0); 561353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije _forceAvdImagePath(AVD_IMAGE_CACHE, opts->cache, "cache", 0); 562353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije _forceAvdImagePath(AVD_IMAGE_SDCARD, opts->sdcard, "SD Card", 0); 563353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije#if CONFIG_ANDROID_SNAPSHOTS 564353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije _forceAvdImagePath(AVD_IMAGE_SNAPSHOTS, opts->snapstorage, "snapshots", 0); 565353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije#endif 5668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* we don't accept -skindir without -skin now 5688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * to simplify the autoconfig stuff with virtual devices 5698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 5708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->no_skin) { 5718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->skin = "320x480"; 5728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->skindir = NULL; 5738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->skindir) { 5768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->skin) { 5778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "the -skindir <path> option requires a -skin <name> option"); 5788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 5798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 581b58c44e55548129243185ef5927bd3abb5903044David Turner android_avdParams->skinName = opts->skin; 582b58c44e55548129243185ef5927bd3abb5903044David Turner android_avdParams->skinRootPath = opts->skindir; 583b58c44e55548129243185ef5927bd3abb5903044David Turner 5848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* setup the virtual device differently depending on whether 5858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * we are in the Android build system or not 5868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 5878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->avd != NULL) 5888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdInfo = avdInfo_new( opts->avd, android_avdParams ); 5908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (android_avdInfo == NULL) { 5918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* an error message has already been printed */ 5928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dprint("could not find virtual device named '%s'", opts->avd); 5938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 5948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 5978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_build_out) { 5998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_build_out = android_build_root = opts->sysdir; 6008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdInfo = avdInfo_newForAndroidBuild( 6028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_build_root, 6038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_build_out, 6048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdParams ); 6058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(android_avdInfo == NULL) { 6078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("could not start virtual device\n"); 6088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 6098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 612cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner avd = android_avdInfo; 613cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 6148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* get the skin from the virtual device configuration */ 615cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner opts->skin = (char*) avdInfo_getSkinName( avd ); 616cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner opts->skindir = (char*) avdInfo_getSkinDir( avd ); 6178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->skin) { 6198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -skin %s", opts->skin); 6208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->skindir) { 6228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -skindir %s", opts->skindir); 6238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Read hardware configuration */ 6268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project hw = android_hw; 627cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (avdInfo_getHwConfig(avd, hw) < 0) { 6288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror("could not read hardware configuration ?"); 6298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 6308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->keyset) { 6338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project parse_keyset(opts->keyset, opts); 6348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_keyset) { 6358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, 6368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "emulator: WARNING: could not find keyset file named '%s'," 6378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " using defaults instead\n", 6388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->keyset); 6398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_keyset) { 6428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project parse_keyset("default", opts); 6438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_keyset) { 6448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_keyset = skin_keyset_new_from_text( skin_keyset_get_default() ); 6458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_keyset) { 6468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "PANIC: default keyset file is corrupted !!\n" ); 6478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "PANIC: please update the code in android/skin/keyset.c\n" ); 6488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 6498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->keyset) 6518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project write_default_keyset(); 6528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 65540beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie if (opts->shared_net_id) { 65640beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie char* end; 65740beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie long shared_net_id = strtol(opts->shared_net_id, &end, 0); 65840beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie if (end == NULL || *end || shared_net_id < 1 || shared_net_id > 255) { 65940beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie fprintf(stderr, "option -shared-net-id must be an integer between 1 and 255\n"); 66040beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie exit(1); 66140beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie } 662b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine snprintf(boot_prop_ip, sizeof(boot_prop_ip), 663b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine "net.shared_net_ip=10.1.2.%ld", shared_net_id); 66440beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie } 66540beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie 66640beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie 667755811e67c266333807571f798b62b6916611f87David 'Digit' Turner user_config_init(); 6682507cab8a78fb609461a2b9cc4708bab60fc53a4David 'Digit' Turner parse_skin_files(opts->skindir, opts->skin, opts, hw, 66974d7acec6643694132a127feb5ccadda7ea793d6David 'Digit' Turner &skinConfig, &skinPath); 6708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->netspeed) { 6728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (skin_network_speed) 6738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("skin network speed: '%s'", skin_network_speed); 6748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->netspeed = (char*)skin_network_speed; 6758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->netdelay) { 6778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (skin_network_delay) 6788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("skin network delay: '%s'", skin_network_delay); 6798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->netdelay = (char*)skin_network_delay; 6808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->trace) { 683cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner char* tracePath = avdInfo_getTracePath(avd, opts->trace); 6848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int ret; 6858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (tracePath == NULL) { 6878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "bad -trace parameter" ); 6888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 6898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = path_mkdir_if_needed( tracePath, 0755 ); 6918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret < 0) { 6928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "could not create directory '%s'\n", tmp); 6938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 6948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->trace = tracePath; 6968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->no_cache) 6998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->cache = 0; 7008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project n = 1; 7028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* generate arguments for the underlying qemu main() */ 703238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner { 704238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner const char* kernelFile = avdInfo_getImageFile(avd, AVD_IMAGE_KERNEL); 705238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner int kernelFileLen = strlen(kernelFile); 706238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner 707238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner args[n++] = "-kernel"; 708238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner args[n++] = (char*)kernelFile; 709238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner 710238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner /* If the kernel image name ends in "-armv7", then change the cpu 711238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * type automatically. This is a poor man's approach to configuration 712238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * management, but should allow us to get past building ARMv7 713238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * system images with dex preopt pass without introducing too many 714238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * changes to the emulator sources. 715238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * 716238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * XXX: 717238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * A 'proper' change would require adding some sort of hardware-property 718238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * to each AVD config file, then automatically determine its value for 719238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * full Android builds (depending on some environment variable), plus 720238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * some build system changes. I prefer not to do that for now for reasons 721238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * of simplicity. 722238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner */ 723238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner if (kernelFileLen > 6 && !memcmp(kernelFile + kernelFileLen - 6, "-armv7", 6)) { 724238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner args[n++] = "-cpu"; 725238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner args[n++] = "cortex-a8"; 726238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner } 727238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner } 7288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 729b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine if (boot_prop_ip[0]) { 730b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine args[n++] = "-boot-property"; 731b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine args[n++] = boot_prop_ip; 732b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine } 733b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine 734318f17a0050e729bce8545463b657c1d62835b5eVladimir Chtchetkine if (opts->tcpdump) { 735318f17a0050e729bce8545463b657c1d62835b5eVladimir Chtchetkine args[n++] = "-tcpdump"; 736318f17a0050e729bce8545463b657c1d62835b5eVladimir Chtchetkine args[n++] = opts->tcpdump; 737318f17a0050e729bce8545463b657c1d62835b5eVladimir Chtchetkine } 738318f17a0050e729bce8545463b657c1d62835b5eVladimir Chtchetkine 739e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine#ifdef CONFIG_NAND_LIMITS 740e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine if (opts->nand_limits) { 741e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = "-nand-limits"; 742e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = opts->nand_limits; 743e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine } 744e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine#endif 745e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine 74674d7acec6643694132a127feb5ccadda7ea793d6David 'Digit' Turner if (opts->timezone) { 74774d7acec6643694132a127feb5ccadda7ea793d6David 'Digit' Turner args[n++] = "-timezone"; 74874d7acec6643694132a127feb5ccadda7ea793d6David 'Digit' Turner args[n++] = opts->timezone; 74974d7acec6643694132a127feb5ccadda7ea793d6David 'Digit' Turner } 75074d7acec6643694132a127feb5ccadda7ea793d6David 'Digit' Turner 751e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine if (opts->netspeed) { 752e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = "-netspeed"; 753e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = opts->netspeed; 754e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine } 755e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine if (opts->netdelay) { 756e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = "-netdelay"; 757e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = opts->netdelay; 758e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine } 759e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine if (opts->netfast) { 760e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = "-netfast"; 761e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine } 762e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine 763b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine /* the purpose of -no-audio is to disable sound output from the emulator, 764b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine * not to disable Audio emulation. So simply force the 'none' backends */ 765b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine if (opts->no_audio) 766b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine opts->audio = "none"; 767b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine 768b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine if (opts->audio) { 769b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = "-audio"; 770b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = opts->audio; 771b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine } 772b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine 773b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine if (opts->cpu_delay) { 774b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = "-cpu-delay"; 775b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = opts->cpu_delay; 776b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine } 777b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine 7787fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine if (opts->dns_server) { 7797fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine args[n++] = "-dns-server"; 7807fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine args[n++] = opts->dns_server; 7817fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine } 7827fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine 7838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-initrd"; 784cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner args[n++] = (char*) avdInfo_getImageFile(avd, AVD_IMAGE_RAMDISK); 7858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 786b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project if (opts->partition_size) { 787b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project char* end; 788cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner long sizeMB = strtol(opts->partition_size, &end, 0); 789cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner long minSizeMB = 10; 790cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner long maxSizeMB = LONG_MAX / ONE_MB; 791b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project 792cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (sizeMB < 0 || *end != 0) { 793b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project derror( "-partition-size must be followed by a positive integer" ); 794b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project exit(1); 795b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project } 796cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (sizeMB < minSizeMB || sizeMB > maxSizeMB) { 797b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project derror( "partition-size (%d) must be between %dMB and %dMB", 798cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner sizeMB, minSizeMB, maxSizeMB ); 799b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project exit(1); 800b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project } 801cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner defaultPartitionSize = sizeMB * ONE_MB; 802cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 803cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 804cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner /* Check the size of the system partition image. 805cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * If we have an AVD, it must be smaller than 806cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * the disk.systemPartition.size hardware property. 807cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * 808cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * Otherwise, we need to adjust the systemPartitionSize 809cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * automatically, and print a warning. 810cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * 811cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner */ 812cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner { 813cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner uint64_t systemBytes = avdInfo_getImageFileSize(avd, AVD_IMAGE_INITSYSTEM); 814def0e542c9cc004a7b83ff965103c34097c0960bDavid 'Digit' Turner uint64_t defaultBytes = defaultPartitionSize; 815cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 816cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (defaultBytes == 0 || opts->partition_size) 817cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner defaultBytes = defaultPartitionSize; 818cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 819cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner systemPartitionSize = _adjustPartitionSize("system", systemBytes, defaultBytes, 820cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner android_build_out != NULL); 821cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 822cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 823cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner /* Check the size of the /data partition. The only interesting cases here are: 824065242de51ba1e18387ce22a99eb091a859990f7David 'Digit' Turner * - when the USERDATA image already exists and is larger than the default 825cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * - when we're wiping data and the INITDATA is larger than the default. 826cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner */ 827cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 828cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner { 829cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner const char* dataPath = avdInfo_getImageFile(avd, AVD_IMAGE_USERDATA); 830def0e542c9cc004a7b83ff965103c34097c0960bDavid 'Digit' Turner uint64_t defaultBytes = defaultPartitionSize; 831cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 832cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (defaultBytes == 0 || opts->partition_size) 833cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner defaultBytes = defaultPartitionSize; 834cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 835cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (dataPath == NULL || !path_exists(dataPath) || opts->wipe_data) { 836cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner dataPath = avdInfo_getImageFile(avd, AVD_IMAGE_INITDATA); 837cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 838cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (dataPath == NULL || !path_exists(dataPath)) { 839cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner dataPartitionSize = defaultBytes; 840cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 841cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner else { 842cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner uint64_t dataBytes; 843cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner path_get_size(dataPath, &dataBytes); 844cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 845cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner dataPartitionSize = _adjustPartitionSize("data", dataBytes, defaultBytes, 846cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner android_build_out != NULL); 847cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 848b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project } 849b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project 8508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 8518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* filetype = "file"; 8528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 853cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (avdInfo_isImageReadOnly(avd, AVD_IMAGE_INITSYSTEM)) 8548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project filetype = "initfile"; 8558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint(tmp, tmpend, 857cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner "system,size=0x%x,%s=%s", systemPartitionSize, filetype, 858cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner avdInfo_getImageFile(avd, AVD_IMAGE_INITSYSTEM)); 8598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-nand"; 8618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = strdup(tmp); 8628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint(tmp, tmpend, 865b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project "userdata,size=0x%x,file=%s", 866cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner dataPartitionSize, 867cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner avdInfo_getImageFile(avd, AVD_IMAGE_USERDATA)); 8688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-nand"; 8708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = strdup(tmp); 8718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (hw->disk_cachePartition) { 873cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner opts->cache = (char*) avdInfo_getImageFile(avd, AVD_IMAGE_CACHE); 8748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cachePartitionSize = hw->disk_cachePartition_size; 8758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (opts->cache) { 8778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dwarning( "Emulated hardware doesn't support a cache partition" ); 8788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->cache = NULL; 8798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->no_cache = 1; 8808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->cache) { 8838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* use a specific cache file */ 8848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sprintf(tmp, "cache,size=0x%0x,file=%s", cachePartitionSize, opts->cache); 8858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-nand"; 8868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = strdup(tmp); 8878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!opts->no_cache) { 8898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* create a temporary cache partition file */ 8908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sprintf(tmp, "cache,size=0x%0x", cachePartitionSize); 8918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-nand"; 8928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = strdup(tmp); 8938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 89592568958dd42bf35667cc6451b5edd7f7d1f73a1David 'Digit' Turner if (hw->hw_sdCard != 0) 896cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner opts->sdcard = (char*) avdInfo_getImageFile(avd, AVD_IMAGE_SDCARD); 89792568958dd42bf35667cc6451b5edd7f7d1f73a1David 'Digit' Turner else if (opts->sdcard) { 8988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dwarning( "Emulated hardware doesn't support SD Cards" ); 8998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->sdcard = NULL; 9008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(opts->sdcard) { 9038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint64_t size; 9048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path_get_size(opts->sdcard, &size) == 0) { 9058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* see if we have an sdcard image. get its size if it exists */ 9068b657e5deaa03b989b0b36791fcf2aa6b2882656David 'Digit' Turner /* due to what looks like limitations of the MMC protocol, one has 9078b657e5deaa03b989b0b36791fcf2aa6b2882656David 'Digit' Turner * to use an SD Card image that is equal or larger than 9 MB 9088b657e5deaa03b989b0b36791fcf2aa6b2882656David 'Digit' Turner */ 9098b657e5deaa03b989b0b36791fcf2aa6b2882656David 'Digit' Turner if (size < 9*1024*1024ULL) { 9108b657e5deaa03b989b0b36791fcf2aa6b2882656David 'Digit' Turner fprintf(stderr, "### WARNING: SD Card files must be at least 9MB, ignoring '%s'\n", opts->sdcard); 9118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 9128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-hda"; 9138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->sdcard; 9148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project use_sdcard_img = 1; 9158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 9178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("no SD Card image at '%s'", opts->sdcard); 9188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 921353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije#if CONFIG_ANDROID_SNAPSHOTS 922353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije if (!opts->no_snapstorage) { 923353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije opts->snapstorage = (char*) avdInfo_getImageFile(avd, AVD_IMAGE_SNAPSHOTS); 924353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije if(opts->snapstorage) { 925353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije if (path_exists(opts->snapstorage)) { 926353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije args[n++] = "-hdb"; 927353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije args[n++] = opts->snapstorage; 928353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } else { 929353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije D("no image at '%s', state snapshots disabled", opts->snapstorage); 930353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 931353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 932353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije 933353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije if (!opts->no_snapshot) { 93424204cc964cf7d56b1a20c12ece08eecab1093faTim Baverstock char* snapshot_name = 93524204cc964cf7d56b1a20c12ece08eecab1093faTim Baverstock opts->snapshot ? opts->snapshot : "default-boot"; 93653d8a5c0c8fc087d16316a4399f5a773339c4956Tim Baverstock if (!opts->no_snapshot_load) { 93753d8a5c0c8fc087d16316a4399f5a773339c4956Tim Baverstock args[n++] = "-loadvm"; 93853d8a5c0c8fc087d16316a4399f5a773339c4956Tim Baverstock args[n++] = snapshot_name; 93953d8a5c0c8fc087d16316a4399f5a773339c4956Tim Baverstock } 94024204cc964cf7d56b1a20c12ece08eecab1093faTim Baverstock if (!opts->no_snapshot_save) { 94124204cc964cf7d56b1a20c12ece08eecab1093faTim Baverstock args[n++] = "-savevm-on-exit"; 94224204cc964cf7d56b1a20c12ece08eecab1093faTim Baverstock args[n++] = snapshot_name; 943353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 944353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } else if (opts->snapshot) { 945353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije dwarning("option '-no-snapshot' overrides '-snapshot', continuing with boot sequence"); 94653d8a5c0c8fc087d16316a4399f5a773339c4956Tim Baverstock } else if (opts->no_snapshot_load || opts->no_snapshot_save) { 94753d8a5c0c8fc087d16316a4399f5a773339c4956Tim Baverstock D("ignoring redundant option(s) '-no-snapshot-load' and/or '-no-snapshot-save' implied by '-no-snapshot'"); 948353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 949622b8f4c760b8c4479d28430f978bad8bb9ea32cTim Baverstock if (opts->no_snapshot_update_time) { 950622b8f4c760b8c4479d28430f978bad8bb9ea32cTim Baverstock android_snapshot_update_time = 0; 951622b8f4c760b8c4479d28430f978bad8bb9ea32cTim Baverstock } 952353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } else if (opts->snapshot || opts->snapstorage) { 953353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije dwarning("option '-no-snapstorage' overrides '-snapshot' and '-snapstorage', " 954353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije "continuing with full boot, state snapshots are disabled"); 955353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } else if (opts->no_snapshot) { 956353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije D("ignoring redundant option '-no-snapshot' implied by '-no-snapstorage'"); 957353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 958ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije 959ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije if (opts->snapshot_list) { 960ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije snapshot_print_and_exit(opts->snapstorage); 961ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije } 962ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije#endif // CONFIG_ANDROID_SNAPSHOTS 963353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije 9648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->logcat || opts->logcat[0] == 0) { 9658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->logcat = getenv("ANDROID_LOG_TAGS"); 9668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->logcat && opts->logcat[0] == 0) 9678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->logcat = NULL; 9688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if 0 9718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->console) { 9728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "option -console is obsolete. please use -shell instead" ); 9738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 9748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 9768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* we always send the kernel messages from ttyS0 to android_kmsg */ 9788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 97913f3b6c53817255217f40db289abace42c3c31a6Vladimir Chtchetkine if (opts->show_kernel) { 98013f3b6c53817255217f40db289abace42c3c31a6Vladimir Chtchetkine args[n++] = "-show-kernel"; 98113f3b6c53817255217f40db289abace42c3c31a6Vladimir Chtchetkine } 9828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 9848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "android-kmsg"; 9858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project serial++; 9868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* XXXX: TODO: implement -shell and -logcat through qemud instead */ 9898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->shell_serial) { 9908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32 9918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->shell_serial = "con:"; 9928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 9938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->shell_serial = "stdio"; 9948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 9958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 9978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->shell = 1; 9988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->shell || opts->logcat) { 10008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 10018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->shell_serial; 10028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project shell_serial = serial++; 10038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->old_system) 10068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->radio) { 10088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 10098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->radio; 10108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project radio_serial = serial++; 10118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else { 10138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 10148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "android-modem"; 10158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project radio_serial = serial++; 10168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->gps) { 10188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 10198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->gps; 10208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project gps_serial = serial++; 10218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else /* !opts->old_system */ 10248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 10268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "android-qemud"; 10278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemud_serial = serial++; 10288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->radio) { 1030b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = "-radio"; 1031b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = opts->radio; 10328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->gps) { 1035b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = "-gps"; 1036b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = opts->gps; 10378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->memory) { 10418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 10428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project long ramSize = strtol(opts->memory, &end, 0); 10438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ramSize < 0 || *end != 0) { 10448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "-memory must be followed by a positive integer" ); 10458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 10468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ramSize < 32 || ramSize > 4096) { 10488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "physical memory size must be between 32 and 4096 MB" ); 10498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 10508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10515377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner hw->hw_ramSize = ramSize; 10528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->memory) { 10543bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner int ramSize = hw->hw_ramSize; 10553bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner if (ramSize <= 0) { 10563bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner /* Compute the default RAM size based on the size of screen. 10573bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner * This is only used when the skin doesn't provide the ram 10583bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner * size through its hardware.ini (i.e. legacy ones) or when 10593bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner * in the full Android build system. 10603bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner */ 10615377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner int64_t pixels = hw->hw_lcd_width * hw->hw_lcd_height; 10623bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner /* The following thresholds are a bit liberal, but we 10633bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner * essentially want to ensure the following mappings: 10643bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner * 10653bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner * 320x480 -> 96 10663bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner * 800x600 -> 128 10673bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner * 1024x768 -> 256 10683bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner * 10693bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner * These are just simple heuristics, they could change in 10703bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner * the future. 10713bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner */ 10723bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner if (pixels <= 250000) 10733bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner ramSize = 96; 10743bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner else if (pixels <= 500000) 10753bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner ramSize = 128; 10763bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner else 10773bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner ramSize = 256; 10783bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner } 10795377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner hw->hw_ramSize = ramSize; 10805377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner } 10815377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner 10825377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner D("Physical RAM size: %dMB\n", hw->hw_ramSize); 10835377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner 10845377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner if (hw->vm_heapSize == 0) { 10855377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner /* Compute the default heap size based on the RAM size. 10865377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner * Essentially, we want to ensure the following liberal mappings: 10875377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner * 10885377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner * 96MB RAM -> 16MB heap 10895377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner * 128MB RAM -> 24MB heap 10905377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner * 256MB RAM -> 48MB heap 10915377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner */ 10925377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner int ramSize = hw->hw_ramSize; 10935377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner int heapSize; 10945377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner 10955377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner if (ramSize < 100) 10965377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner heapSize = 16; 10975377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner else if (ramSize < 192) 10985377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner heapSize = 24; 10995377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner else 11005377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner heapSize = 48; 11015377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner 11025377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner hw->vm_heapSize = heapSize; 11038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->trace) { 11068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-trace"; 11078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->trace; 11088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-tracing"; 11098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "off"; 11108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1112b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine /* Pass boot properties to the core. */ 1113b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine if (opts->prop != NULL) { 1114b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine ParamList* pl = opts->prop; 1115b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine for ( ; pl != NULL; pl = pl->next ) { 1116b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine args[n++] = "-boot-property"; 1117b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine args[n++] = pl->param; 1118b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine } 1119b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine } 1120b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine 11218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-append"; 11228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->bootchart) { 11248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 11258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int timeout = strtol(opts->bootchart, &end, 10); 11268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (timeout == 0) 11278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->bootchart = NULL; 11288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (timeout < 0 || timeout > 15*60) { 11298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "timeout specified for -bootchart option is invalid.\n" 11308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "please use integers between 1 and 900\n"); 11318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 11328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1135318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner /* Setup the kernel init options 1136318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner */ 11378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 11388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static char params[1024]; 11398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char *p = params, *end = p + sizeof(params); 11408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, "qemu=1 console=ttyS0" ); 1142334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima#ifdef TARGET_I386 1143334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima p = bufprint(p, end, " androidboot.hardware=goldfish"); 1144bac9add881e0b7cfa2da2b86242347c096329a4cJun Nakajima p = bufprint(p, end, " clocksource=pit"); 1145334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima#endif 11468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->shell || opts->logcat) { 11488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " androidboot.console=ttyS%d", shell_serial ); 11498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->trace) { 11528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " android.tracing=1"); 11538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->no_jni) { 11568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " android.checkjni=1"); 11578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->no_boot_anim) { 11608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint( p, end, " android.bootanim=0" ); 11618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->logcat) { 11648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* q = bufprint(p, end, " androidboot.logcat=%s", opts->logcat); 11658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (q < end) { 11678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* replace any space by a comma ! */ 11688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 11698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 11708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 1; p[nn] != 0; nn++) 11718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p[nn] == ' ' || p[nn] == '\t') 11728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p[nn] = ','; 11738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p += nn; 11748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = q; 11778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->old_system) 11808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 11818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " android.ril=ttyS%d", radio_serial); 11828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->gps) { 11848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " android.gps=ttyS%d", gps_serial); 11858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 11888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 11898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " android.qemud=ttyS%d", qemud_serial); 11908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->bootchart) { 11938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " androidboot.bootchart=%s", opts->bootchart); 11948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p >= end) { 11978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "### ERROR: kernel parameters too long\n"); 11988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 11998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = strdup(params); 12028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1204d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine if (opts->ports) { 1205d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = "-android-ports"; 1206d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = opts->ports; 1207d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine } 1208d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine 1209d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine if (opts->port) { 1210d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = "-android-port"; 1211d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = opts->port; 1212d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine } 1213d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine 1214d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine if (opts->report_console) { 1215d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = "-android-report-console"; 1216d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = opts->report_console; 1217d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine } 1218d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine 1219d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine if (opts->http_proxy) { 1220d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = "-http-proxy"; 1221d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = opts->http_proxy; 1222d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine } 1223d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine 122443552dc4fa64aad0c9fdb8f4c92ae7ac79406596Vladimir Chtchetkine if (opts->charmap) { 122543552dc4fa64aad0c9fdb8f4c92ae7ac79406596Vladimir Chtchetkine args[n++] = "-charmap"; 122643552dc4fa64aad0c9fdb8f4c92ae7ac79406596Vladimir Chtchetkine args[n++] = opts->charmap; 122743552dc4fa64aad0c9fdb8f4c92ae7ac79406596Vladimir Chtchetkine } 122843552dc4fa64aad0c9fdb8f4c92ae7ac79406596Vladimir Chtchetkine 1229b5365f32d7b1dcc6c3e9be7584ce8d4f68b3e7e1Vladimir Chtchetkine if (opts->memcheck) { 1230b5365f32d7b1dcc6c3e9be7584ce8d4f68b3e7e1Vladimir Chtchetkine args[n++] = "-android-memcheck"; 1231b5365f32d7b1dcc6c3e9be7584ce8d4f68b3e7e1Vladimir Chtchetkine args[n++] = opts->memcheck; 1232b5365f32d7b1dcc6c3e9be7584ce8d4f68b3e7e1Vladimir Chtchetkine } 1233b5365f32d7b1dcc6c3e9be7584ce8d4f68b3e7e1Vladimir Chtchetkine 12345377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner /* physical memory is now in hw->hw_ramSize */ 12358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* on Linux, the 'dynticks' clock sometimes doesn't work 12378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * properly. this results in the UI freezing while emulation 12388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * continues, for several seconds... 12398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 12408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef __linux__ 12418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-clock"; 12428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "unix"; 12438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 12448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 124540beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie /* Set up the interfaces for inter-emulator networking */ 124640beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie if (opts->shared_net_id) { 124740beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie unsigned int shared_net_id = atoi(opts->shared_net_id); 124840beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie char nic[37]; 124940beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie 125040beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie args[n++] = "-net"; 125140beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie args[n++] = "nic,vlan=0"; 125240beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie args[n++] = "-net"; 125340beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie args[n++] = "user,vlan=0"; 1254111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie 1255111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie args[n++] = "-net"; 1256111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie snprintf(nic, sizeof nic, "nic,vlan=1,macaddr=52:54:00:12:34:%02x", shared_net_id); 1257111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie args[n++] = strdup(nic); 1258111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie args[n++] = "-net"; 1259111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie args[n++] = "socket,vlan=1,mcast=230.0.0.10:1234"; 126040beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie } 126140beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie 12628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while(argc-- > 0) { 12638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = *argv++; 12648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n] = 0; 12668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1267622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner /* Generate a temporary hardware.ini for this AVD. The real hardware 1268622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner * configuration is ususally stored in several files, e.g. the AVD's 1269622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner * config.ini plus the skin-specific hardware.ini. 1270622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner * 1271622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner * The new temp file will group all definitions and will be used to 1272622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner * launch the core with the -android-hw <file> option. 1273622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner */ 1274622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner { 127542074e5e184aed78dee0efb14d7376325516c070David 'Digit' Turner const char* coreHwIniPath = avdInfo_getCoreHwIniPath(avd); 127642074e5e184aed78dee0efb14d7376325516c070David 'Digit' Turner IniFile* hwIni = iniFile_newFromMemory("", NULL); 1277622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner androidHwConfig_write(hw, hwIni); 127842074e5e184aed78dee0efb14d7376325516c070David 'Digit' Turner if (iniFile_saveToFile(hwIni, coreHwIniPath) < 0) { 127942074e5e184aed78dee0efb14d7376325516c070David 'Digit' Turner derror("Could not write hardware.ini to %s: %s", coreHwIniPath, strerror(errno)); 1280622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner exit(2); 1281622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner } 1282622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner args[n++] = "-android-hw"; 128342074e5e184aed78dee0efb14d7376325516c070David 'Digit' Turner args[n++] = strdup(coreHwIniPath); 1284622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner } 1285622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner 12868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(VERBOSE_CHECK(init)) { 12878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int i; 12883336176fc898915b7b5544f3a7c60ec2794507c3David 'Digit' Turner printf("QEMU options list:\n"); 12898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for(i = 0; i < n; i++) { 12903336176fc898915b7b5544f3a7c60ec2794507c3David 'Digit' Turner printf("emulator: argv[%02d] = \"%s\"\n", i, args[i]); 12918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12923336176fc898915b7b5544f3a7c60ec2794507c3David 'Digit' Turner /* Dump final command-line option to make debugging the core easier */ 12933336176fc898915b7b5544f3a7c60ec2794507c3David 'Digit' Turner printf("Concatenated QEMU options:\n"); 12943336176fc898915b7b5544f3a7c60ec2794507c3David 'Digit' Turner for (i = 0; i < n; i++) { 12953336176fc898915b7b5544f3a7c60ec2794507c3David 'Digit' Turner printf(" %s", args[i]); 12963336176fc898915b7b5544f3a7c60ec2794507c3David 'Digit' Turner } 12973336176fc898915b7b5544f3a7c60ec2794507c3David 'Digit' Turner printf("\n"); 12988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 129974d7acec6643694132a127feb5ccadda7ea793d6David 'Digit' Turner 130074d7acec6643694132a127feb5ccadda7ea793d6David 'Digit' Turner /* Setup SDL UI just before calling the code */ 130174d7acec6643694132a127feb5ccadda7ea793d6David 'Digit' Turner init_sdl_ui(skinConfig, skinPath, opts); 130274d7acec6643694132a127feb5ccadda7ea793d6David 'Digit' Turner 13038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return qemu_main(n, args); 13048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1305