V10/cmd/adb/vax/regs.c
/*
* code to keep track of registers
*/
#include "defs.h"
#include "regs.h"
#include "space.h"
struct reglist {
char *rname;
short roffs;
short rsys;
TREG rval;
};
struct reglist reglist[] = {
{"p1lr", P1LR, 1},
{"p1br", P1BR, 1},
{"p0lr", P0LR, 1},
{"p0br", P0BR, 1},
{"ksp", KSP, 1},
{"esp", ESP, 1},
{"ssp", SSP, 1},
#define FW 7 /* first register we may write */
{"psl", PSL, 0},
{"pc", PC, 0},
{"sp", USP, 0},
{"fp", FP, 0},
{"ap", AP, 0},
{"r11", R11, 0},
{"r10", R10, 0},
{"r9", R9, 0},
{"r8", R8, 0},
{"r7", R7, 0},
{"r6", R6, 0},
{"r5", R5, 0},
{"r4", R4, 0},
{"r3", R3, 0},
{"r2", R2, 0},
{"r1", R1, 0},
{"r0", R0, 0},
{NULL}
};
/*
* the following are needed only to
* make registers `addressable'
* which is needed only so we can
* examine register variables
*/
ADDR raddr[MAXREG - MINREG + 1];
int roffs[MAXREG - MINREG + 1] = {
R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11
};
/*
* get/put registers
* in our saved copies
*/
TREG
rget(r)
{
register struct reglist *rp;
for (rp = reglist; rp->rname; rp++)
if (rp->roffs == r)
return (rp->rval);
error("panic: rget");
/* NOTREACHED */
}
rput(r, v)
TREG v;
{
register struct reglist *rp;
for (rp = reglist; rp->rname; rp++)
if (rp->roffs == r) {
rp->rval = v;
return;
}
error("panic: rput");
/* NOTREACHED */
}
/*
* grab registers into saved copy
* should be called before looking at the process
*/
rsnarf()
{
register struct reglist *rp;
for (rp = reglist; rp->rname; rp++) {
rp->rval = 0;
fget((ADDR)rp->roffs, CORF|UBLKSP, (char *)&rp->rval, SZREG);
}
}
/*
* put registers back
*/
rrest()
{
register struct reglist *rp;
if (pid == 0)
return;
for (rp = ®list[FW]; rp->rname; rp++)
fput((ADDR)rp->roffs, CORF|UBLKSP, (char *)&rp->rval, SZREG);
}
/*
* print the registers
*/
printregs(c)
char c;
{
register struct reglist *rp;
for (rp = reglist; rp->rname; rp++) {
if (rp->rsys == 1 && c != 'R')
continue;
printf("%-8R >%s\n", rtow(rp->rval), rp->rname);
}
printpc();
}
/*
* translate a name to a magic register offset
* the latter useful in rget/rput
*/
int
rname(n)
char *n;
{
register struct reglist *rp;
for (rp = reglist; rp->rname; rp++)
if (strcmp(n, rp->rname) == 0)
return (rp->roffs);
return (BADREG);
}