Deleted Added
sdiff udiff text old ( 4098:9b57d3d6af2a ) new ( 5754:b50a557f93df )
full compact
1/*
2 * Copyright (c) 2003-2005 The Regents of The University of Michigan
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;

--- 15 unchanged lines hidden (view full) ---

24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 * Authors: Nathan Binkert
29 */
30
31#include <inttypes.h>
32#include <err.h>
33#include <fcntl.h>
34#include <stdio.h>
35#include <stdlib.h>
36#include <string.h>
37#include <unistd.h>
38
39#include "m5op.h"
40
41char *progname;
42char *command = "unspecified";
43void usage();
44
45void
46parse_int_args(int argc, char *argv[], uint64_t ints[], int len)
47{
48 if (argc > len)
49 usage();
50
51 int i;
52 for (i = 0; i < len; ++i)
53 ints[i] = (i < argc) ? strtoul(argv[i], NULL, 0) : 0;
54}
55
56int
57read_file(int dest_fid)
58{
59 char buf[256*1024];
60 int offset = 0;
61 int len;
62
63 while ((len = m5_readfile(buf, sizeof(buf), offset)) > 0) {
64 write(dest_fid, buf, len);
65 offset += len;
66 }
67}
68
69void
70do_exit(int argc, char *argv[])
71{
72 if (argc > 1)
73 usage();
74
75 m5_exit((argc > 0) ? strtoul(argv[0], NULL, 0) : 0);
76}
77
78void
79do_reset_stats(int argc, char *argv[])
80{
81 uint64_t ints[2];
82 parse_int_args(argc, argv, ints, 2);
83 m5_reset_stats(ints[0], ints[1]);
84}
85
86void
87do_dump_stats(int argc, char *argv[])
88{
89 uint64_t ints[2];
90 parse_int_args(argc, argv, ints, 2);
91 m5_dump_stats(ints[0], ints[1]);
92}
93
94void
95do_dump_reset_stats(int argc, char *argv[])
96{
97 uint64_t ints[2];
98 parse_int_args(argc, argv, ints, 2);
99 m5_dumpreset_stats(ints[0], ints[1]);
100}
101
102void
103do_read_file(int argc, char *argv[])
104{
105 if (argc > 0)
106 usage();
107
108 read_file(STDOUT_FILENO);
109}
110
111void
112do_exec_file(int argc, char *argv[])
113{
114 if (argc > 0)
115 usage();
116
117 const char *destname = "/tmp/execfile";
118
119 int fid = open(destname, O_WRONLY, 0777);
120 int len = read_file(fid);
121 close(fid);
122 if (len > 0) {
123 execl(destname, "execfile", NULL);
124 err(1, "execl failed!");
125 }
126}
127
128void
129do_checkpoint(int argc, char *argv[])
130{
131 uint64_t ints[2];
132 parse_int_args(argc, argv, ints, 2);
133 m5_checkpoint(ints[0], ints[1]);
134}
135
136void
137do_load_symbol(int argc, char *argv[])
138{
139 if (argc != 2)
140 usage();
141
142 uint64_t addr = strtoul(argv[0], NULL, 0);
143 char *symbol = argv[1];
144 m5_loadsymbol(addr, symbol);
145}
146
147void
148do_initparam(int argc, char *argv[])
149{
150 if (argc != 0)
151 usage();
152
153
154 printf("%ld", m5_initparam());
155}
156
157void
158do_sw99param(int argc, char *argv[])
159{
160 if (argc != 0)
161 usage();
162
163 uint64_t param = m5_initparam();
164
165 // run-time, rampup-time, rampdown-time, warmup-time, connections
166 printf("%d %d %d %d %d", (param >> 48) & 0xfff,
167 (param >> 36) & 0xfff, (param >> 24) & 0xfff,
168 (param >> 12) & 0xfff, (param >> 0) & 0xfff);
169}
170
171struct MainFunc
172{
173 char *name;
174 void (*func)(int argc, char *argv[]);
175 char *usage;
176};
177
178struct MainFunc mainfuncs[] = {
179 { "exit", do_exit, "[delay]" },
180 { "resetstats", do_reset_stats, "[delay [period]]" },
181 { "dumpstats", do_dump_stats, "[delay [period]]" },
182 { "dumpresetstats", do_dump_reset_stats, "[delay [period]]" },
183 { "readfile", do_read_file, "[filename]" },
184 { "execfile", do_exec_file, "<filename>" },
185 { "checkpoint", do_checkpoint, "[delay [period]]" },
186 { "loadsymbol", do_load_symbol, "<address> <symbol>" },
187 { "initparam", do_initparam, "" },
188 { "sw99param", do_sw99param, "" },
189};
190int numfuncs = sizeof(mainfuncs) / sizeof(mainfuncs[0]);
191
192void
193usage()
194{
195 int i;
196
197 for (i = 0; i < numfuncs; ++i) {
198 char *header = i ? "" : "usage:";
199 fprintf(stderr, "%-6s %s %s %s\n",
200 header, progname, mainfuncs[i].name, mainfuncs[i].usage);
201 }
202 fprintf(stderr, "\n");
203 fprintf(stderr, "All times in nanoseconds!\n");
204
205 exit(1);
206}
207
208int
209main(int argc, char *argv[])
210{
211 progname = argv[0];
212 if (argc < 2)
213 usage(1);
214
215 command = argv[1];
216
217 argv += 2;
218 argc -= 2;
219
220 int i;
221 for (i = 0; i < numfuncs; ++i) {
222 if (strcmp(command, mainfuncs[i].name) != 0)
223 continue;
224
225 mainfuncs[i].func(argc, argv);
226 exit(0);
227 }
228
229 usage(1);
230}