From e13168648d5947955e0fd4fbf396f891ae53921f Mon Sep 17 00:00:00 2001 From: Vladimir Chtchetkine Date: Thu, 26 Aug 2010 09:03:54 -0700 Subject: Moved nand and netspeed initialization from main to core. Change-Id: Ide3914fa52f62f618d39ac20f02bce8185a6805a --- android/main.c | 148 +++++++---------------------------------------------- hw/goldfish_nand.c | 110 ++++++++++++++++++++++++++++++++++++++- hw/goldfish_nand.h | 1 + qemu-options.hx | 14 +++++ vl-android.c | 60 ++++++++++++++++++++++ 5 files changed, 202 insertions(+), 131 deletions(-) diff --git a/android/main.c b/android/main.c index f06d619..03d0ffd 100644 --- a/android/main.c +++ b/android/main.c @@ -577,113 +577,6 @@ write_default_keyset( void ) } } -#ifdef CONFIG_NAND_LIMITS - -static uint64_t -parse_nand_rw_limit( const char* value ) -{ - char* end; - uint64_t val = strtoul( value, &end, 0 ); - - if (end == value) { - derror( "bad parameter value '%s': expecting unsigned integer", value ); - exit(1); - } - - switch (end[0]) { - case 'K': val <<= 10; break; - case 'M': val <<= 20; break; - case 'G': val <<= 30; break; - case 0: break; - default: - derror( "bad read/write limit suffix: use K, M or G" ); - exit(1); - } - return val; -} - -static void -parse_nand_limits(char* limits) -{ - int pid = -1, signal = -1; - int64_t reads = 0, writes = 0; - char* item = limits; - - /* parse over comma-separated items */ - while (item && *item) { - char* next = strchr(item, ','); - char* end; - - if (next == NULL) { - next = item + strlen(item); - } else { - *next++ = 0; - } - - if ( !memcmp(item, "pid=", 4) ) { - pid = strtol(item+4, &end, 10); - if (end == NULL || *end) { - derror( "bad parameter, expecting pid=, got '%s'", - item ); - exit(1); - } - if (pid <= 0) { - derror( "bad parameter: process identifier must be > 0" ); - exit(1); - } - } - else if ( !memcmp(item, "signal=", 7) ) { - signal = strtol(item+7,&end, 10); - if (end == NULL || *end) { - derror( "bad parameter: expecting signal=, got '%s'", - item ); - exit(1); - } - if (signal <= 0) { - derror( "bad parameter: signal number must be > 0" ); - exit(1); - } - } - else if ( !memcmp(item, "reads=", 6) ) { - reads = parse_nand_rw_limit(item+6); - } - else if ( !memcmp(item, "writes=", 7) ) { - writes = parse_nand_rw_limit(item+7); - } - else { - derror( "bad parameter '%s' (see -help-nand-limits)", item ); - exit(1); - } - item = next; - } - if (pid < 0) { - derror( "bad paramater: missing pid=" ); - exit(1); - } - else if (signal < 0) { - derror( "bad parameter: missing signal=" ); - exit(1); - } - else if (reads == 0 && writes == 0) { - dwarning( "no read or write limit specified. ignoring -nand-limits" ); - } else { - nand_threshold* t; - - t = &android_nand_read_threshold; - t->pid = pid; - t->signal = signal; - t->counter = 0; - t->limit = reads; - - t = &android_nand_write_threshold; - t->pid = pid; - t->signal = signal; - t->counter = 0; - t->limit = writes; - } -} -#endif /* CONFIG_NAND_LIMITS */ - void emulator_help( void ) { STRALLOC_DEFINE(out); @@ -1194,11 +1087,6 @@ int main(int argc, char **argv) exit(1); } -#ifdef CONFIG_NAND_LIMITS - if (opts->nand_limits) - parse_nand_limits(opts->nand_limits); -#endif - if (opts->keyset) { parse_keyset(opts->keyset, opts); if (!android_keyset) { @@ -1249,23 +1137,6 @@ int main(int argc, char **argv) opts->netdelay = (char*)skin_network_delay; } - if ( android_parse_network_speed(opts->netspeed) < 0 ) { - fprintf(stderr, "invalid -netspeed parameter '%s', see emulator -usage\n", opts->netspeed); - emulator_help(); - } - - if ( android_parse_network_latency(opts->netdelay) < 0 ) { - fprintf(stderr, "invalid -netdelay parameter '%s', see emulator -usage\n", opts->netdelay); - emulator_help(); - } - - if (opts->netfast) { - qemu_net_download_speed = 0; - qemu_net_upload_speed = 0; - qemu_net_min_latency = 0; - qemu_net_max_latency = 0; - } - if (opts->trace) { char* tracePath = avdInfo_getTracePath(avd, opts->trace); int ret; @@ -1319,6 +1190,25 @@ int main(int argc, char **argv) } } +#ifdef CONFIG_NAND_LIMITS + if (opts->nand_limits) { + args[n++] = "-nand-limits"; + args[n++] = opts->nand_limits; + } +#endif + + if (opts->netspeed) { + args[n++] = "-netspeed"; + args[n++] = opts->netspeed; + } + if (opts->netdelay) { + args[n++] = "-netdelay"; + args[n++] = opts->netdelay; + } + if (opts->netfast) { + args[n++] = "-netfast"; + } + /* the purpose of -no-audio is to disable sound output from the emulator, * not to disable Audio emulation. So simply force the 'none' backends */ if (opts->no_audio) diff --git a/hw/goldfish_nand.c b/hw/goldfish_nand.c index 2d23baa..1570095 100644 --- a/hw/goldfish_nand.c +++ b/hw/goldfish_nand.c @@ -76,13 +76,13 @@ nand_threshold_update( nand_threshold* t, uint32_t len ) avail = len; if (t->counter == 0) { - T("%s: starting threshold counting to %lld", + T("%s: starting threshold counting to %lld", __FUNCTION__, t->limit); } t->counter += avail; if (t->counter >= t->limit) { /* threshold reach, send a signal to an external process */ - T( "%s: sending signal %d to pid %d !", + T( "%s: sending signal %d to pid %d !", __FUNCTION__, t->signal, t->pid ); kill( t->pid, t->signal ); @@ -632,3 +632,109 @@ bad_arg_and_value: exit(1); } +#ifdef CONFIG_NAND_LIMITS + +static uint64_t +parse_nand_rw_limit( const char* value ) +{ + char* end; + uint64_t val = strtoul( value, &end, 0 ); + + if (end == value) { + derror( "bad parameter value '%s': expecting unsigned integer", value ); + exit(1); + } + + switch (end[0]) { + case 'K': val <<= 10; break; + case 'M': val <<= 20; break; + case 'G': val <<= 30; break; + case 0: break; + default: + derror( "bad read/write limit suffix: use K, M or G" ); + exit(1); + } + return val; +} + +void +parse_nand_limits(char* limits) +{ + int pid = -1, signal = -1; + int64_t reads = 0, writes = 0; + char* item = limits; + + /* parse over comma-separated items */ + while (item && *item) { + char* next = strchr(item, ','); + char* end; + + if (next == NULL) { + next = item + strlen(item); + } else { + *next++ = 0; + } + + if ( !memcmp(item, "pid=", 4) ) { + pid = strtol(item+4, &end, 10); + if (end == NULL || *end) { + derror( "bad parameter, expecting pid=, got '%s'", + item ); + exit(1); + } + if (pid <= 0) { + derror( "bad parameter: process identifier must be > 0" ); + exit(1); + } + } + else if ( !memcmp(item, "signal=", 7) ) { + signal = strtol(item+7,&end, 10); + if (end == NULL || *end) { + derror( "bad parameter: expecting signal=, got '%s'", + item ); + exit(1); + } + if (signal <= 0) { + derror( "bad parameter: signal number must be > 0" ); + exit(1); + } + } + else if ( !memcmp(item, "reads=", 6) ) { + reads = parse_nand_rw_limit(item+6); + } + else if ( !memcmp(item, "writes=", 7) ) { + writes = parse_nand_rw_limit(item+7); + } + else { + derror( "bad parameter '%s' (see -help-nand-limits)", item ); + exit(1); + } + item = next; + } + if (pid < 0) { + derror( "bad paramater: missing pid=" ); + exit(1); + } + else if (signal < 0) { + derror( "bad parameter: missing signal=" ); + exit(1); + } + else if (reads == 0 && writes == 0) { + dwarning( "no read or write limit specified. ignoring -nand-limits" ); + } else { + nand_threshold* t; + + t = &android_nand_read_threshold; + t->pid = pid; + t->signal = signal; + t->counter = 0; + t->limit = reads; + + t = &android_nand_write_threshold; + t->pid = pid; + t->signal = signal; + t->counter = 0; + t->limit = writes; + } +} +#endif /* CONFIG_NAND_LIMITS */ diff --git a/hw/goldfish_nand.h b/hw/goldfish_nand.h index dcc59d8..a8f3652 100644 --- a/hw/goldfish_nand.h +++ b/hw/goldfish_nand.h @@ -14,6 +14,7 @@ void nand_dev_init(uint32_t base); void nand_add_dev(const char *arg); +void parse_nand_limits(char* limits); typedef struct { uint64_t limit; diff --git a/qemu-options.hx b/qemu-options.hx index 000e231..d2d32c8 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -1657,4 +1657,18 @@ DEF("cpu-delay", HAS_ARG, QEMU_OPTION_cpu_delay, \ DEF("show-kernel", 0, QEMU_OPTION_show_kernel, \ "-show-kernel display kernel messages\n") +#ifdef CONFIG_NAND_LIMITS +DEF("nand-limits", HAS_ARG, QEMU_OPTION_nand_limits, \ + "-nand-limits enforce NAND/Flash read/write thresholds\n") +#endif // CONFIG_NAND_LIMITS + +DEF("netspeed", HAS_ARG, QEMU_OPTION_netspeed, \ + "-netspeed maximum network download/upload speeds\n") + +DEF("netdelay", HAS_ARG, QEMU_OPTION_netdelay, \ + "-netdelay network latency emulation\n") + +DEF("netfast", 0, QEMU_OPTION_netfast, \ + "-netfast disable network shaping\n") + #endif diff --git a/vl-android.c b/vl-android.c index c136a07..cdaeb64 100644 --- a/vl-android.c +++ b/vl-android.c @@ -373,6 +373,20 @@ char* android_op_audio_out = NULL; /* -cpu-delay option value. */ char* android_op_cpu_delay = NULL; +#ifdef CONFIG_NAND_LIMITS +/* -nand-limits option value. */ +char* android_op_nand_limits = NULL; +#endif // CONFIG_NAND_LIMITS + +/* -netspeed option value. */ +char* android_op_netspeed = NULL; + +/* -netdelay option value. */ +char* android_op_netdelay = NULL; + +/* -netfast option value. */ +int android_op_netfast = 0; + extern int android_display_width; extern int android_display_height; extern int android_display_bpp; @@ -5926,6 +5940,25 @@ int main(int argc, char **argv, char **envp) android_kmsg_init(ANDROID_KMSG_PRINT_MESSAGES); break; +#ifdef CONFIG_NAND_LIMITS + case QEMU_OPTION_nand_limits: + android_op_nand_limits = (char*)optarg; + break; +#endif // CONFIG_NAND_LIMITS + + case QEMU_OPTION_netspeed: + android_op_netspeed = (char*)optarg; + break; + + case QEMU_OPTION_netdelay: + android_op_netdelay = (char*)optarg; + break; + + case QEMU_OPTION_netfast: + android_op_netfast = 1; + break; + + #ifdef CONFIG_MEMCHECK case QEMU_OPTION_android_memcheck: android_op_memcheck = (char*)optarg; @@ -5980,6 +6013,33 @@ int main(int argc, char **argv, char **envp) iniFile_free(hw_ini); #endif // CONFIG_STANDALONE_CORE +#ifdef CONFIG_NAND_LIMITS + /* Init nand stuff. */ + if (android_op_nand_limits) { + parse_nand_limits(android_op_nand_limits); + } +#endif // CONFIG_NAND_LIMITS + + /* Initialize net speed and delays stuff. */ + if (android_parse_network_speed(android_op_netspeed) < 0 ) { + fprintf(stderr, "invalid -netspeed parameter '%s'\n", + android_op_netspeed); + exit(1); + } + + if ( android_parse_network_latency(android_op_netdelay) < 0 ) { + fprintf(stderr, "invalid -netdelay parameter '%s'\n", + android_op_netdelay); + exit(1); + } + + if (android_op_netfast) { + qemu_net_download_speed = 0; + qemu_net_upload_speed = 0; + qemu_net_min_latency = 0; + qemu_net_max_latency = 0; + } + /* Initialize modem */ if (android_op_radio) { CharDriverState* cs = qemu_chr_open("radio", android_op_radio, NULL); -- cgit v1.1