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:
parent
166def1f56
commit
15613161c2
4 changed files with 152 additions and 0 deletions
13
util/m5/Makefile
Normal file
13
util/m5/Makefile
Normal 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
62
util/m5/m5.c
Normal 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
11
util/m5/m5op.h
Normal 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
66
util/m5/m5op.s
Normal 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)
|
Loading…
Reference in a new issue