31a32,33
> #include <err.h>
> #include <fcntl.h>
39a42,43
> char *command = "unspecified";
> void usage();
42c46
< usage()
---
> parse_int_args(int argc, char *argv[], uint64_t ints[], int len)
44,54c48,53
< printf("usage: m5 initparam\n"
< " m5 sw99param\n"
< " m5 exit [delay]\n"
< " m5 resetstats [delay [period]]\n"
< " m5 dumpstats [delay [period]]\n"
< " m5 dumpresetstats [delay [period]]\n"
< " m5 checkpoint [delay [period]]\n"
< " m5 readfile\n"
< "\n"
< "All times in nanoseconds!\n");
< exit(1);
---
> if (argc > len)
> usage();
>
> int i;
> for (i = 0; i < len; ++i)
> ints[i] = (i < argc) ? strtoul(argv[i], NULL, 0) : 0;
57,58d55
< #define COMPARE(X) (strcmp(X, command) == 0)
<
60c57
< main(int argc, char *argv[])
---
> read_file(int dest_fid)
62,65c59,61
< char *command;
< uint64_t param;
< uint64_t arg1 = 0;
< uint64_t arg2 = 0;
---
> char buf[256*1024];
> int offset = 0;
> int len;
67,68c63,72
< progname = argv[0];
< if (argc < 2)
---
> while ((len = m5_readfile(buf, sizeof(buf), offset)) > 0) {
> write(dest_fid, buf, len);
> offset += len;
> }
> }
>
> void
> do_exit(int argc, char *argv[])
> {
> if (argc > 1)
71c75,76
< command = argv[1];
---
> m5_exit((argc > 0) ? strtoul(argv[0], NULL, 0) : 0);
> }
73,75c78,84
< if (COMPARE("initparam")) {
< if (argc != 2)
< usage();
---
> void
> do_reset_stats(int argc, char *argv[])
> {
> uint64_t ints[2];
> parse_int_args(argc, argv, ints, 2);
> m5_reset_stats(ints[0], ints[1]);
> }
77,79c86,92
< printf("%ld", m5_initparam());
< return 0;
< }
---
> void
> do_dump_stats(int argc, char *argv[])
> {
> uint64_t ints[2];
> parse_int_args(argc, argv, ints, 2);
> m5_dump_stats(ints[0], ints[1]);
> }
81,83c94,100
< if (COMPARE("sw99param")) {
< if (argc != 2)
< usage();
---
> void
> do_dump_reset_stats(int argc, char *argv[])
> {
> uint64_t ints[2];
> parse_int_args(argc, argv, ints, 2);
> m5_dumpreset_stats(ints[0], ints[1]);
> }
85,89c102,106
< param = m5_initparam();
< // run-time, rampup-time, rampdown-time, warmup-time, connections
< printf("%d %d %d %d %d", (param >> 48) & 0xfff,
< (param >> 36) & 0xfff, (param >> 24) & 0xfff,
< (param >> 12) & 0xfff, (param >> 0) & 0xfff);
---
> void
> do_read_file(int argc, char *argv[])
> {
> if (argc > 0)
> usage();
91,92c108,109
< return 0;
< }
---
> read_file(STDOUT_FILENO);
> }
94,100c111,115
< if (COMPARE("exit")) {
< switch (argc) {
< case 3:
< arg1 = strtoul(argv[2], NULL, 0);
< case 2:
< m5_exit(arg1);
< return 0;
---
> void
> do_exec_file(int argc, char *argv[])
> {
> if (argc > 0)
> usage();
102,104c117,124
< default:
< usage();
< }
---
> const char *destname = "/tmp/execfile";
>
> int fid = open(destname, O_WRONLY, 0777);
> int len = read_file(fid);
> close(fid);
> if (len > 0) {
> execl(destname, "execfile", NULL);
> err(1, "execl failed!");
105a126
> }
107,115c128,134
< if (COMPARE("resetstats")) {
< switch (argc) {
< case 4:
< arg2 = strtoul(argv[3], NULL, 0);
< case 3:
< arg1 = strtoul(argv[2], NULL, 0);
< case 2:
< m5_reset_stats(arg1, arg2);
< return 0;
---
> void
> do_checkpoint(int argc, char *argv[])
> {
> uint64_t ints[2];
> parse_int_args(argc, argv, ints, 2);
> m5_checkpoint(ints[0], ints[1]);
> }
117,120c136,140
< default:
< usage();
< }
< }
---
> void
> do_load_symbol(int argc, char *argv[])
> {
> if (argc != 2)
> usage();
122,130c142,145
< if (COMPARE("dumpstats")) {
< switch (argc) {
< case 4:
< arg2 = strtoul(argv[3], NULL, 0);
< case 3:
< arg1 = strtoul(argv[2], NULL, 0);
< case 2:
< m5_dump_stats(arg1, arg2);
< return 0;
---
> uint64_t addr = strtoul(argv[0], NULL, 0);
> char *symbol = argv[1];
> m5_loadsymbol(addr, symbol);
> }
132,135c147,151
< default:
< usage();
< }
< }
---
> void
> do_initparam(int argc, char *argv[])
> {
> if (argc != 0)
> usage();
137,145c153,155
< if (COMPARE("dumpresetstats")) {
< switch (argc) {
< case 4:
< arg2 = strtoul(argv[3], NULL, 0);
< case 3:
< arg1 = strtoul(argv[2], NULL, 0);
< case 2:
< m5_dumpreset_stats(arg1, arg2);
< return 0;
---
>
> printf("%ld", m5_initparam());
> }
147,150c157,161
< default:
< usage();
< }
< }
---
> void
> do_sw99param(int argc, char *argv[])
> {
> if (argc != 0)
> usage();
152,155c163
< if (COMPARE("readfile")) {
< char buf[256*1024];
< int offset = 0;
< int len;
---
> uint64_t param = m5_initparam();
157,158c165,169
< if (argc != 2)
< usage();
---
> // run-time, rampup-time, rampdown-time, warmup-time, connections
> printf("%d %d %d %d %d", (param >> 48) & 0xfff,
> (param >> 36) & 0xfff, (param >> 24) & 0xfff,
> (param >> 12) & 0xfff, (param >> 0) & 0xfff);
> }
160,163c171,176
< while ((len = m5_readfile(buf, sizeof(buf), offset)) > 0) {
< write(STDOUT_FILENO, buf, len);
< offset += len;
< }
---
> struct MainFunc
> {
> char *name;
> void (*func)(int argc, char *argv[]);
> char *usage;
> };
165c178,200
< return 0;
---
> struct MainFunc mainfuncs[] = {
> { "exit", do_exit, "[delay]" },
> { "resetstats", do_reset_stats, "[delay [period]]" },
> { "dumpstats", do_dump_stats, "[delay [period]]" },
> { "dumpresetstats", do_dump_reset_stats, "[delay [period]]" },
> { "readfile", do_read_file, "[filename]" },
> { "execfile", do_exec_file, "<filename>" },
> { "checkpoint", do_checkpoint, "[delay [period]]" },
> { "loadsymbol", do_load_symbol, "<address> <symbol>" },
> { "initparam", do_initparam, "" },
> { "sw99param", do_sw99param, "" },
> };
> int numfuncs = sizeof(mainfuncs) / sizeof(mainfuncs[0]);
>
> void
> usage()
> {
> int i;
>
> for (i = 0; i < numfuncs; ++i) {
> char *header = i ? "" : "usage:";
> fprintf(stderr, "%-6s %s %s %s\n",
> header, progname, mainfuncs[i].name, mainfuncs[i].usage);
166a202,203
> fprintf(stderr, "\n");
> fprintf(stderr, "All times in nanoseconds!\n");
168,176c205,206
< if (COMPARE("checkpoint")) {
< switch (argc) {
< case 4:
< arg2 = strtoul(argv[3], NULL, 0);
< case 3:
< arg1 = strtoul(argv[2], NULL, 0);
< case 2:
< m5_checkpoint(arg1, arg2);
< return 0;
---
> exit(1);
> }
178,180c208,213
< default:
< usage();
< }
---
> int
> main(int argc, char *argv[])
> {
> progname = argv[0];
> if (argc < 2)
> usage(1);
182,183c215
< return 0;
< }
---
> command = argv[1];
185,187c217,226
< if (COMPARE("loadsymbol")) {
< m5_loadsymbol(arg1);
< return 0;
---
> argv += 2;
> argc -= 2;
>
> int i;
> for (i = 0; i < numfuncs; ++i) {
> if (strcmp(command, mainfuncs[i].name) != 0)
> continue;
>
> mainfuncs[i].func(argc, argv);
> exit(0);
189c228,229
< usage();
---
>
> usage(1);