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