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} |