aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sim/common/ChangeLog9
-rw-r--r--sim/common/sim-memopt.c25
-rw-r--r--sim/common/sim-options.c20
3 files changed, 47 insertions, 7 deletions
diff --git a/sim/common/ChangeLog b/sim/common/ChangeLog
index 84824a8..b31a19e 100644
--- a/sim/common/ChangeLog
+++ b/sim/common/ChangeLog
@@ -1,3 +1,12 @@
+2007-08-10 Nick Clifton <nickc@redhat.com>
+
+ * sim-memopt.c (memory_options): Mention that the
+ --memory-size switch accepts suffixes.
+ (parse_size): Handle a suffix on the size value.
+ * sim-options.c (standard_options): Mention that the mem-size
+ switch accepts suffixes.
+ (standard_option_handler): Handle a suffix on the size value.
+
2006-12-21 Hans-Peter Nilsson <hp@axis.com>
* acconfig.h: Remove.
diff --git a/sim/common/sim-memopt.c b/sim/common/sim-memopt.c
index c7591b8..0e73b9f 100644
--- a/sim/common/sim-memopt.c
+++ b/sim/common/sim-memopt.c
@@ -90,8 +90,8 @@ static const OPTION memory_options[] =
memory_option_handler },
{ {"memory-size", required_argument, NULL, OPTION_MEMORY_SIZE },
- '\0', "SIZE", "Add memory at address zero",
- memory_option_handler },
+ '\0', "<size>[in bytes, Kb (k suffix), Mb (m suffix) or Gb (g suffix)]",
+ "Add memory at address zero", memory_option_handler },
{ {"memory-fill", required_argument, NULL, OPTION_MEMORY_FILL },
'\0', "VALUE", "Fill subsequently added memory regions",
@@ -286,11 +286,28 @@ parse_size (char *chp,
address_word *nr_bytes,
unsigned *modulo)
{
- /* <nr_bytes> [ "%" <modulo> ] */
+ /* <nr_bytes>[K|M|G] [ "%" <modulo> ] */
*nr_bytes = strtoul (chp, &chp, 0);
- if (*chp == '%')
+ switch (*chp)
{
+ case '%':
*modulo = strtoul (chp + 1, &chp, 0);
+ break;
+ case 'g': case 'G': /* Gigabyte suffix. */
+ *nr_bytes <<= 10;
+ /* Fall through. */
+ case 'm': case 'M': /* Megabyte suffix. */
+ *nr_bytes <<= 10;
+ /* Fall through. */
+ case 'k': case 'K': /* Kilobyte suffix. */
+ *nr_bytes <<= 10;
+ /* Check for a modulo specifier after the suffix. */
+ ++ chp;
+ if (* chp == 'b' || * chp == 'B')
+ ++ chp;
+ if (* chp == '%')
+ *modulo = strtoul (chp + 1, &chp, 0);
+ break;
}
return chp;
}
diff --git a/sim/common/sim-options.c b/sim/common/sim-options.c
index 51d3136..614cde8 100644
--- a/sim/common/sim-options.c
+++ b/sim/common/sim-options.c
@@ -167,8 +167,8 @@ static const OPTION standard_options[] =
#ifdef SIM_HAVE_FLATMEM
{ {"mem-size", required_argument, NULL, OPTION_MEM_SIZE},
- 'm', "MEMORY SIZE", "Specify memory size",
- standard_option_handler },
+ 'm', "<size>[in bytes, Kb (k suffix), Mb (m suffix) or Gb (g suffix)]",
+ "Specify memory size", standard_option_handler },
#endif
{ {"do-command", required_argument, NULL, OPTION_DO_COMMAND},
@@ -381,7 +381,21 @@ standard_option_handler (SIM_DESC sd, sim_cpu *cpu, int opt,
#ifdef SIM_HAVE_FLATMEM
case OPTION_MEM_SIZE:
{
- unsigned long ul = strtol (arg, NULL, 0);
+ char * endp;
+ unsigned long ul = strtol (arg, &endp, 0);
+
+ switch (* endp)
+ {
+ case 'k': case 'K': size <<= 10; break;
+ case 'm': case 'M': size <<= 20; break;
+ case 'g': case 'G': size <<= 30; break;
+ case ' ': case '\0': case '\t': break;
+ default:
+ if (ul > 0)
+ sim_io_eprintf (sd, "Ignoring strange character at end of memory size: %c\n", * endp);
+ break;
+ }
+
/* 16384: some minimal amount */
if (! isdigit (arg[0]) || ul < 16384)
{