summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--util/m5/Makefile29
-rw-r--r--util/m5/m5.c158
-rw-r--r--util/m5/m5op.h16
-rw-r--r--util/m5/m5op.s51
4 files changed, 198 insertions, 56 deletions
diff --git a/util/m5/Makefile b/util/m5/Makefile
index f77a6cac3..6e4ad31a3 100644
--- a/util/m5/Makefile
+++ b/util/m5/Makefile
@@ -1,13 +1,26 @@
-all: m5
+AS=as
+CC=cc
+LD=cc
-m5: m5.o m5op.o
- cc -o m5 m5.o m5op.o
+CCFLAGS=-O2
+#LDFLAGS=-non_shared
-m5op.o: m5op.s
- as -o m5op.o m5op.s
+all: m5
-m5.o: m5.c
- cc -c -o m5.o m5.c
+m5: m5op.o m5.o
+ $(LD) $(LDFLAGS) -o $@ $>
+ strip $@
clean:
- @rm -f m5 *.o *~
+ @rm -f m5 *.o *.d *~ .#*
+
+.SUFFIXES:
+.SUFFIXES:.o .c .s
+
+# C Compilation
+.c.o:
+ $(CC) $(CCFLAGS) -o $@ -c $<
+
+# Assembly
+.s.o:
+ $(AS) $(ASFLAGS) -o $@ $<
diff --git a/util/m5/m5.c b/util/m5/m5.c
index d17faf90b..1271bc9e1 100644
--- a/util/m5/m5.c
+++ b/util/m5/m5.c
@@ -26,9 +26,7 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include <c_asm.h>
-
-#include <libgen.h>
+#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -40,51 +38,149 @@ char *progname;
void
usage()
{
- char *name = basename(progname);
- printf("usage: %s ivlb <interval>\n"
- " %s ivle <interval>\n"
- " %s initparam\n"
- " %s sw99param\n"
- " %s resetstats\n"
- " %s exit\n", name, name, name, name, name, name);
+ printf("usage: m5 ivlb <interval>\n"
+ " m5 ivle <interval>\n"
+ " 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"
+ "\n"
+ "All times in nanoseconds!\n");
exit(1);
}
+#define COMPARE(X) (strcmp(X, command) == 0)
+
int
main(int argc, char *argv[])
{
- int start;
- int interval;
- unsigned long long param;
+ char *command;
+ uint64_t param;
+ uint64_t arg1 = 0;
+ uint64_t arg2 = 0;
progname = argv[0];
if (argc < 2)
usage();
- if (strncmp(argv[1], "ivlb", 5) == 0) {
- if (argc != 3) usage();
- ivlb((unsigned long)atoi(argv[2]));
- } else if (strncmp(argv[1], "ivle", 5) == 0) {
- if (argc != 3) usage();
- ivle((unsigned long)atoi(argv[2]));
- } else if (strncmp(argv[1], "exit", 5) == 0) {
- if (argc != 2) usage();
- m5exit();
- } else if (strncmp(argv[1], "initparam", 10) == 0) {
- if (argc != 2) usage();
- printf("%d", initparam());
- } else if (strncmp(argv[1], "sw99param", 10) == 0) {
- if (argc != 2) usage();
+ command = argv[1];
+
+ if (COMPARE("ivlb")) {
+ if (argc != 3)
+ usage();
+
+ arg1 = strtoul(argv[2], NULL, 0);
+ ivlb(arg1);
+ return 0;
+ }
+
+ if (COMPARE("ivle")) {
+ if (argc != 3)
+ usage();
+
+ arg1 = strtoul(argv[2], NULL, 0);
+ ivle(arg1);
+ return 0;
+ }
+
+ if (COMPARE("initparam")) {
+ if (argc != 2)
+ usage();
+
+ printf("%ld", initparam());
+ return 0;
+ }
+
+ if (COMPARE("sw99param")) {
+ if (argc != 2)
+ usage();
param = 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);
- } else if (strncmp(argv[1], "resetstats", 11) == 0) {
- if (argc != 2) usage();
- resetstats();
+
+ return 0;
+ }
+
+ if (COMPARE("exit")) {
+ switch (argc) {
+ case 3:
+ arg1 = strtoul(argv[2], NULL, 0);
+ case 2:
+ m5exit(arg1);
+ return 0;
+
+ default:
+ usage();
+ }
+ }
+
+ if (COMPARE("resetstats")) {
+ switch (argc) {
+ case 4:
+ arg2 = strtoul(argv[3], NULL, 0);
+ case 3:
+ arg1 = strtoul(argv[2], NULL, 0);
+ case 2:
+ reset_stats(arg1, arg2);
+ return 0;
+
+ default:
+ usage();
+ }
+ }
+
+ if (COMPARE("dumpstats")) {
+ switch (argc) {
+ case 4:
+ arg2 = strtoul(argv[3], NULL, 0);
+ case 3:
+ arg1 = strtoul(argv[2], NULL, 0);
+ case 2:
+ dump_stats(arg1, arg2);
+ return 0;
+
+ default:
+ usage();
+ }
+ }
+
+ if (COMPARE("dumpresetstats")) {
+ switch (argc) {
+ case 4:
+ arg2 = strtoul(argv[3], NULL, 0);
+ case 3:
+ arg1 = strtoul(argv[2], NULL, 0);
+ case 2:
+ dumpreset_stats(arg1, arg2);
+ return 0;
+
+ default:
+ usage();
+ }
+ }
+
+ if (COMPARE("checkpoint")) {
+ switch (argc) {
+ case 4:
+ arg2 = strtoul(argv[3], NULL, 0);
+ case 3:
+ arg1 = strtoul(argv[2], NULL, 0);
+ case 2:
+ checkpoint(arg1, arg2);
+ return 0;
+
+ default:
+ usage();
+ }
+
+ return 0;
}
- return 0;
+ usage();
}
diff --git a/util/m5/m5op.h b/util/m5/m5op.h
index ee24f6948..266460ce9 100644
--- a/util/m5/m5op.h
+++ b/util/m5/m5op.h
@@ -29,11 +29,17 @@
#ifndef __M5OP_H__
#define __M5OP_H__
-void arm(unsigned long address);
+#include <inttypes.h>
+
+void arm(uint64_t address);
void quiesce();
-void ivlb(unsigned long interval);
-void ivle(unsigned long interval);
-void m5exit();
-unsigned long initparam();
+void ivlb(uint64_t interval);
+void ivle(uint64_t interval);
+void m5exit(uint64_t ns_delay);
+uint64_t initparam();
+void checkpoint(uint64_t ns_delay, uint64_t ns_period);
+void reset_stats(uint64_t ns_delay, uint64_t ns_period);
+void dump_stats(uint64_t ns_delay, uint64_t ns_period);
+void dumpreset_stats(uint64_t ns_delay, uint64_t ns_period);
#endif // __M5OP_H__
diff --git a/util/m5/m5op.s b/util/m5/m5op.s
index 18efbc959..8004e66c6 100644
--- a/util/m5/m5op.s
+++ b/util/m5/m5op.s
@@ -30,13 +30,18 @@
#include <regdef.h>
#define m5_op 0x01
+
#define arm_func 0x00
#define quiesce_func 0x01
#define ivlb_func 0x10
#define ivle_func 0x11
-#define m5exit_func 0x20
+#define exit_old_func 0x20 // deprectated!
+#define exit_func 0x21
#define initparam_func 0x30
#define resetstats_func 0x40
+#define dumpstats_func 0x41
+#define dumprststats_func 0x42
+#define ckpt_func 0x43
#define INST(op, ra, rb, func) \
.long (((op) << 26) | ((ra) << 21) | ((rb) << 16) | (func))
@@ -45,9 +50,12 @@
#define QUIESCE() INST(m5_op, 0, 0, quiesce_func)
#define IVLB(reg) INST(m5_op, reg, 0, ivlb_func)
#define IVLE(reg) INST(m5_op, reg, 0, ivle_func)
-#define M5_EXIT() INST(m5_op, 0, 0, m5exit_func)
+#define M5EXIT(reg) INST(m5_op, reg, 0, exit_func)
#define INITPARAM(reg) INST(m5_op, reg, 0, initparam_func)
-#define RESETSTATS() INST(m5_op, 0, 0, resetstats_func)
+#define RESET_STATS(r1, r2) INST(m5_op, r1, r2, resetstats_func)
+#define DUMP_STATS(r1, r2) INST(m5_op, r1, r2, dumpstats_func)
+#define DUMPRST_STATS(r1, r2) INST(m5_op, r1, r2, dumprststats_func)
+#define CHECKPOINT(r1, r2) INST(m5_op, r1, r2, ckpt_func)
.set noreorder
@@ -77,18 +85,37 @@ END(ivle)
.align 4
LEAF(m5exit)
- M5_EXIT()
+ M5EXIT(16)
RET
END(m5exit)
- .align 4
+ .align 4
LEAF(initparam)
- INITPARAM(0)
- RET
+ INITPARAM(0)
+ RET
END(initparam)
- .align 4
-LEAF(resetstats)
- RESETSTATS()
- RET
-END(resetstats)
+ .align 4
+LEAF(reset_stats)
+ RESET_STATS(16, 17)
+ RET
+END(reset_stats)
+
+ .align 4
+LEAF(dump_stats)
+ DUMP_STATS(16, 17)
+ RET
+END(dump_stats)
+
+ .align 4
+LEAF(dumpreset_stats)
+ DUMPRST_STATS(16, 17)
+ RET
+END(dumpreset_stats)
+
+ .align 4
+LEAF(checkpoint)
+ CHECKPOINT(16, 17)
+ RET
+END(checkpoint)
+