Commit a command for use inside a simulated system for communicating
authorNathan Binkert <binkertn@umich.edu>
Sat, 1 Nov 2003 18:20:44 +0000 (13:20 -0500)
committerNathan Binkert <binkertn@umich.edu>
Sat, 1 Nov 2003 18:20:44 +0000 (13:20 -0500)
with the simulator.  This program is generally compiled as the name
m5 and installed in /usr/local/bin

This command uses opcodes that are invalid on a normal system, so
don't expect it to do anything on a real system.

--HG--
extra : convert_revision : fcbae99d4b0d38ff4a9950f1ab53923baa1f667a

util/m5/Makefile [new file with mode: 0644]
util/m5/m5.c [new file with mode: 0644]
util/m5/m5op.h [new file with mode: 0644]
util/m5/m5op.s [new file with mode: 0644]

diff --git a/util/m5/Makefile b/util/m5/Makefile
new file mode 100644 (file)
index 0000000..f77a6ca
--- /dev/null
@@ -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 (file)
index 0000000..4bd515c
--- /dev/null
@@ -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 (file)
index 0000000..53de314
--- /dev/null
@@ -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 (file)
index 0000000..fb92bfb
--- /dev/null
@@ -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