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 @@ +AS=as +CC=cc +LD=cc + +CCFLAGS=-O2 +#LDFLAGS=-non_shared + 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 +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 - -#include +#include #include #include #include @@ -40,51 +38,149 @@ char *progname; void usage() { - char *name = basename(progname); - printf("usage: %s ivlb \n" - " %s ivle \n" - " %s initparam\n" - " %s sw99param\n" - " %s resetstats\n" - " %s exit\n", name, name, name, name, name, name); + printf("usage: m5 ivlb \n" + " m5 ivle \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; } - 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; + } + + 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 + +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 #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) +