diff options
-rw-r--r-- | util/m5/Makefile | 13 | ||||
-rw-r--r-- | util/m5/m5.c | 62 | ||||
-rw-r--r-- | util/m5/m5op.h | 11 | ||||
-rw-r--r-- | util/m5/m5op.s | 66 |
4 files changed, 152 insertions, 0 deletions
diff --git a/util/m5/Makefile b/util/m5/Makefile new file mode 100644 index 000000000..f77a6cac3 --- /dev/null +++ b/util/m5/Makefile @@ -0,0 +1,13 @@ +all: m5 + +m5: m5.o m5op.o + cc -o m5 m5.o m5op.o + +m5op.o: m5op.s + as -o m5op.o m5op.s + +m5.o: m5.c + cc -c -o m5.o m5.c + +clean: + @rm -f m5 *.o *~ diff --git a/util/m5/m5.c b/util/m5/m5.c new file mode 100644 index 000000000..4bd515c5d --- /dev/null +++ b/util/m5/m5.c @@ -0,0 +1,62 @@ +#include <c_asm.h> + +#include <libgen.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "m5op.h" + +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); + exit(1); +} + +int +main(int argc, char *argv[]) +{ + int start; + int interval; + unsigned long long param; + + 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(); + + 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; +} diff --git a/util/m5/m5op.h b/util/m5/m5op.h new file mode 100644 index 000000000..53de3144d --- /dev/null +++ b/util/m5/m5op.h @@ -0,0 +1,11 @@ +#ifndef __M5OP_H__ +#define __M5OP_H__ + +void arm(unsigned long address); +void quiesce(); +void ivlb(unsigned long interval); +void ivle(unsigned long interval); +void m5exit(); +unsigned long initparam(); + +#endif // __M5OP_H__ diff --git a/util/m5/m5op.s b/util/m5/m5op.s new file mode 100644 index 000000000..fb92bfb9a --- /dev/null +++ b/util/m5/m5op.s @@ -0,0 +1,66 @@ +#include <machine/asm.h> +#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 initparam_func 0x30 +#define resetstats_func 0x40 + +#define INST(op, ra, rb, func) \ + .long (((op) << 26) | ((ra) << 21) | ((rb) << 16) | (func)) + +#define ARM(reg) INST(m5_op, reg, 0, arm_func) +#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 INITPARAM(reg) INST(m5_op, reg, 0, initparam_func) +#define RESETSTATS() INST(m5_op, 0, 0, resetstats_func) + + .set noreorder + + .align 4 +LEAF(arm) + ARM(16) + RET +END(arm) + + .align 4 +LEAF(quiesce) + QUIESCE() + RET +END(quiesce) + + .align 4 +LEAF(ivlb) + IVLB(16) + RET +END(ivlb) + + .align 4 +LEAF(ivle) + IVLE(16) + RET +END(ivle) + + .align 4 +LEAF(m5exit) + M5_EXIT() + RET +END(m5exit) + + .align 4 +LEAF(initparam) + INITPARAM(0) + RET +END(initparam) + + .align 4 +LEAF(resetstats) + RESETSTATS() + RET +END(resetstats)
\ No newline at end of file |