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