aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVladimir Chtchetkine <vchtchetkine@google.com>2010-08-26 09:03:54 -0700
committerVladimir Chtchetkine <vchtchetkine@google.com>2010-08-26 09:03:54 -0700
commite13168648d5947955e0fd4fbf396f891ae53921f (patch)
tree6ca7f9f091daa6097e5b36812be87c905a243f81
parent3f16680b70d6c065fd2c1672ae324a49c5d1d316 (diff)
downloadexternal_qemu-e13168648d5947955e0fd4fbf396f891ae53921f.zip
external_qemu-e13168648d5947955e0fd4fbf396f891ae53921f.tar.gz
external_qemu-e13168648d5947955e0fd4fbf396f891ae53921f.tar.bz2
Moved nand and netspeed initialization from main to core.
Change-Id: Ide3914fa52f62f618d39ac20f02bce8185a6805a
-rw-r--r--android/main.c148
-rw-r--r--hw/goldfish_nand.c110
-rw-r--r--hw/goldfish_nand.h1
-rw-r--r--qemu-options.hx14
-rw-r--r--vl-android.c60
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=<number>, 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=<number>, 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=<number>" );
- exit(1);
- }
- else if (signal < 0) {
- derror( "bad parameter: missing signal=<number>" );
- 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=<number>, 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=<number>, 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=<number>" );
+ exit(1);
+ }
+ else if (signal < 0) {
+ derror( "bad parameter: missing signal=<number>" );
+ 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 <nlimits> enforce NAND/Flash read/write thresholds\n")
+#endif // CONFIG_NAND_LIMITS
+
+DEF("netspeed", HAS_ARG, QEMU_OPTION_netspeed, \
+ "-netspeed <speed> maximum network download/upload speeds\n")
+
+DEF("netdelay", HAS_ARG, QEMU_OPTION_netdelay, \
+ "-netdelay <delay> 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);