m5.c revision 3545:a49b07ba610e
112396SRiken.Gohil@arm.com/*
212811Sandreas.sandberg@arm.com * Copyright (c) 2003-2005 The Regents of The University of Michigan
312396SRiken.Gohil@arm.com * All rights reserved.
412396SRiken.Gohil@arm.com *
512396SRiken.Gohil@arm.com * Redistribution and use in source and binary forms, with or without
612396SRiken.Gohil@arm.com * modification, are permitted provided that the following conditions are
712396SRiken.Gohil@arm.com * met: redistributions of source code must retain the above copyright
812396SRiken.Gohil@arm.com * notice, this list of conditions and the following disclaimer;
912396SRiken.Gohil@arm.com * redistributions in binary form must reproduce the above copyright
1012396SRiken.Gohil@arm.com * notice, this list of conditions and the following disclaimer in the
1112396SRiken.Gohil@arm.com * documentation and/or other materials provided with the distribution;
1212396SRiken.Gohil@arm.com * neither the name of the copyright holders nor the names of its
1312396SRiken.Gohil@arm.com * contributors may be used to endorse or promote products derived from
1412396SRiken.Gohil@arm.com * this software without specific prior written permission.
1512396SRiken.Gohil@arm.com *
1612396SRiken.Gohil@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1712396SRiken.Gohil@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1812396SRiken.Gohil@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1912396SRiken.Gohil@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2012396SRiken.Gohil@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2112396SRiken.Gohil@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2212396SRiken.Gohil@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2312396SRiken.Gohil@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2412396SRiken.Gohil@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2512396SRiken.Gohil@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2612396SRiken.Gohil@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2712396SRiken.Gohil@arm.com *
2812396SRiken.Gohil@arm.com * Authors: Nathan Binkert
2912396SRiken.Gohil@arm.com */
3012396SRiken.Gohil@arm.com
3112396SRiken.Gohil@arm.com#include <inttypes.h>
3212396SRiken.Gohil@arm.com#include <stdio.h>
3312396SRiken.Gohil@arm.com#include <stdlib.h>
3412396SRiken.Gohil@arm.com#include <string.h>
3512396SRiken.Gohil@arm.com#include <unistd.h>
3612396SRiken.Gohil@arm.com
3712396SRiken.Gohil@arm.com#include "m5op.h"
3812396SRiken.Gohil@arm.com
3912396SRiken.Gohil@arm.comchar *progname;
4012396SRiken.Gohil@arm.com
4112396SRiken.Gohil@arm.comvoid
4212396SRiken.Gohil@arm.comusage()
4312396SRiken.Gohil@arm.com{
4412396SRiken.Gohil@arm.com    printf("usage: m5 initparam\n"
4512396SRiken.Gohil@arm.com           "       m5 sw99param\n"
4612396SRiken.Gohil@arm.com           "       m5 exit [delay]\n"
4712811Sandreas.sandberg@arm.com           "       m5 resetstats [delay [period]]\n"
4812396SRiken.Gohil@arm.com           "       m5 dumpstats [delay [period]]\n"
4912396SRiken.Gohil@arm.com           "       m5 dumpresetstats [delay [period]]\n"
5012811Sandreas.sandberg@arm.com           "       m5 checkpoint [delay [period]]\n"
5112396SRiken.Gohil@arm.com           "       m5 readfile\n"
5212811Sandreas.sandberg@arm.com           "\n"
5312396SRiken.Gohil@arm.com           "All times in nanoseconds!\n");
5412844Sgiacomo.travaglini@arm.com    exit(1);
5512844Sgiacomo.travaglini@arm.com}
5612811Sandreas.sandberg@arm.com
5712396SRiken.Gohil@arm.com#define COMPARE(X) (strcmp(X, command) == 0)
5812396SRiken.Gohil@arm.com
5912396SRiken.Gohil@arm.comint
6012396SRiken.Gohil@arm.commain(int argc, char *argv[])
6112396SRiken.Gohil@arm.com{
6212396SRiken.Gohil@arm.com    char *command;
6312396SRiken.Gohil@arm.com    uint64_t param;
6412396SRiken.Gohil@arm.com    uint64_t arg1 = 0;
6512749Sgiacomo.travaglini@arm.com    uint64_t arg2 = 0;
6612396SRiken.Gohil@arm.com
6712396SRiken.Gohil@arm.com    progname = argv[0];
6812396SRiken.Gohil@arm.com    if (argc < 2)
6912396SRiken.Gohil@arm.com        usage();
7012396SRiken.Gohil@arm.com
7112396SRiken.Gohil@arm.com    command = argv[1];
7212396SRiken.Gohil@arm.com
7312396SRiken.Gohil@arm.com    if (COMPARE("ivlb")) {
7412396SRiken.Gohil@arm.com        if (argc != 3)
7512396SRiken.Gohil@arm.com            usage();
7612396SRiken.Gohil@arm.com
7712396SRiken.Gohil@arm.com        arg1 = strtoul(argv[2], NULL, 0);
7812396SRiken.Gohil@arm.com        m5_ivlb(arg1);
7912396SRiken.Gohil@arm.com        return 0;
8012396SRiken.Gohil@arm.com    }
8112396SRiken.Gohil@arm.com
8212811Sandreas.sandberg@arm.com    if (COMPARE("ivle")) {
8312844Sgiacomo.travaglini@arm.com        if (argc != 3)
8412844Sgiacomo.travaglini@arm.com            usage();
8512844Sgiacomo.travaglini@arm.com
8612844Sgiacomo.travaglini@arm.com        arg1 = strtoul(argv[2], NULL, 0);
8712811Sandreas.sandberg@arm.com        m5_ivle(arg1);
8812811Sandreas.sandberg@arm.com        return 0;
8912844Sgiacomo.travaglini@arm.com    }
9012811Sandreas.sandberg@arm.com
9112844Sgiacomo.travaglini@arm.com    if (COMPARE("initparam")) {
9212844Sgiacomo.travaglini@arm.com        if (argc != 2)
9312844Sgiacomo.travaglini@arm.com            usage();
9412811Sandreas.sandberg@arm.com
9512811Sandreas.sandberg@arm.com        printf("%ld", m5_initparam());
9612811Sandreas.sandberg@arm.com        return 0;
9712811Sandreas.sandberg@arm.com    }
9812811Sandreas.sandberg@arm.com
9912811Sandreas.sandberg@arm.com    if (COMPARE("sw99param")) {
10012811Sandreas.sandberg@arm.com        if (argc != 2)
10112811Sandreas.sandberg@arm.com            usage();
10212811Sandreas.sandberg@arm.com
10312811Sandreas.sandberg@arm.com        param = m5_initparam();
10412811Sandreas.sandberg@arm.com        // run-time, rampup-time, rampdown-time, warmup-time, connections
10512811Sandreas.sandberg@arm.com        printf("%d %d %d %d %d", (param >> 48) & 0xfff,
106               (param >> 36) & 0xfff, (param >> 24) & 0xfff,
107               (param >> 12) & 0xfff, (param >> 0) & 0xfff);
108
109        return 0;
110    }
111
112    if (COMPARE("exit")) {
113        switch (argc) {
114          case 3:
115            arg1 = strtoul(argv[2], NULL, 0);
116          case 2:
117            m5_exit(arg1);
118            return 0;
119
120          default:
121            usage();
122        }
123    }
124
125    if (COMPARE("resetstats")) {
126        switch (argc) {
127          case 4:
128            arg2 = strtoul(argv[3], NULL, 0);
129          case 3:
130            arg1 = strtoul(argv[2], NULL, 0);
131          case 2:
132            m5_reset_stats(arg1, arg2);
133            return 0;
134
135          default:
136            usage();
137        }
138    }
139
140    if (COMPARE("dumpstats")) {
141        switch (argc) {
142          case 4:
143            arg2 = strtoul(argv[3], NULL, 0);
144          case 3:
145            arg1 = strtoul(argv[2], NULL, 0);
146          case 2:
147            m5_dump_stats(arg1, arg2);
148            return 0;
149
150          default:
151            usage();
152        }
153    }
154
155    if (COMPARE("dumpresetstats")) {
156        switch (argc) {
157          case 4:
158            arg2 = strtoul(argv[3], NULL, 0);
159          case 3:
160            arg1 = strtoul(argv[2], NULL, 0);
161          case 2:
162            m5_dumpreset_stats(arg1, arg2);
163            return 0;
164
165          default:
166            usage();
167        }
168    }
169
170    if (COMPARE("readfile")) {
171            char buf[256*1024];
172            int offset = 0;
173            int len;
174
175            if (argc != 2)
176                    usage();
177
178            while ((len = m5_readfile(buf, sizeof(buf), offset)) > 0) {
179                    write(STDOUT_FILENO, buf, len);
180                    offset += len;
181            }
182
183            return 0;
184    }
185
186    if (COMPARE("checkpoint")) {
187        switch (argc) {
188          case 4:
189            arg2 = strtoul(argv[3], NULL, 0);
190          case 3:
191            arg1 = strtoul(argv[2], NULL, 0);
192          case 2:
193            m5_checkpoint(arg1, arg2);
194            return 0;
195
196          default:
197            usage();
198        }
199
200        return 0;
201    }
202
203    if (COMPARE("loadsymbol")) {
204        m5_loadsymbol(arg1);
205        return 0;
206    if (COMPARE("readfile")) {
207            char buf[256*1024];
208            int offset = 0;
209            int len;
210
211            if (argc != 2)
212                    usage();
213
214            while ((len = m5_readfile(buf, sizeof(buf), offset)) > 0) {
215                    write(STDOUT_FILENO, buf, len);
216                    offset += len;
217            }
218
219            return 0;
220    }
221
222    usage();
223}
224