Commit a command for use inside a simulated system for communicating

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
This commit is contained in:
Nathan Binkert 2003-11-01 13:20:44 -05:00
parent 166def1f56
commit 15613161c2
4 changed files with 152 additions and 0 deletions

13
util/m5/Makefile Normal file
View file

@ -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 *~

62
util/m5/m5.c Normal file
View file

@ -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;
}

11
util/m5/m5op.h Normal file
View file

@ -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__

66
util/m5/m5op.s Normal file
View file

@ -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)