Index: sim/common/sim-memopt.c =================================================================== RCS file: /cvs/src/src/sim/common/sim-memopt.c,v retrieving revision 1.4 diff -c -3 -p -r1.4 sim-memopt.c *** sim/common/sim-memopt.c 9 Jan 2007 17:59:16 -0000 1.4 --- sim/common/sim-memopt.c 10 Aug 2007 10:54:01 -0000 *************** static const OPTION memory_options[] = *** 90,97 **** memory_option_handler }, { {"memory-size", required_argument, NULL, OPTION_MEMORY_SIZE }, ! '\0', "SIZE", "Add memory at address zero", ! memory_option_handler }, { {"memory-fill", required_argument, NULL, OPTION_MEMORY_FILL }, '\0', "VALUE", "Fill subsequently added memory regions", --- 90,97 ---- memory_option_handler }, { {"memory-size", required_argument, NULL, OPTION_MEMORY_SIZE }, ! '\0', "[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", *************** parse_size (char *chp, *** 286,296 **** address_word *nr_bytes, unsigned *modulo) { ! /* [ "%" ] */ *nr_bytes = strtoul (chp, &chp, 0); ! if (*chp == '%') { *modulo = strtoul (chp + 1, &chp, 0); } return chp; } --- 286,313 ---- address_word *nr_bytes, unsigned *modulo) { ! /* [K|M|G] [ "%" ] */ *nr_bytes = strtoul (chp, &chp, 0); ! 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; } Index: sim/common/sim-options.c =================================================================== RCS file: /cvs/src/src/sim/common/sim-options.c,v retrieving revision 1.9 diff -c -3 -p -r1.9 sim-options.c *** sim/common/sim-options.c 9 Jan 2007 17:59:16 -0000 1.9 --- sim/common/sim-options.c 10 Aug 2007 10:54:01 -0000 *************** static const OPTION standard_options[] = *** 167,174 **** #ifdef SIM_HAVE_FLATMEM { {"mem-size", required_argument, NULL, OPTION_MEM_SIZE}, ! 'm', "MEMORY SIZE", "Specify memory size", ! standard_option_handler }, #endif { {"do-command", required_argument, NULL, OPTION_DO_COMMAND}, --- 167,174 ---- #ifdef SIM_HAVE_FLATMEM { {"mem-size", required_argument, NULL, OPTION_MEM_SIZE}, ! 'm', "[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}, *************** standard_option_handler (SIM_DESC sd, si *** 381,387 **** #ifdef SIM_HAVE_FLATMEM case OPTION_MEM_SIZE: { ! unsigned long ul = strtol (arg, NULL, 0); /* 16384: some minimal amount */ if (! isdigit (arg[0]) || ul < 16384) { --- 381,401 ---- #ifdef SIM_HAVE_FLATMEM case OPTION_MEM_SIZE: { ! 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) {