V10/cmd/adb/seq/regs.c
/*
* code to keep track of registers
*/
#include "defs.h"
#include "space.h"
#include "regs.h"
#include "machine.h"
#include <sys/param.h>
#include <sys/dir.h>
#include <sys/user.h>
#define UOFF(x) (ADDR)(&((struct user *)0)->x)
struct reglist {
char *rname;
short roffs;
short rsys;
TREG rval;
};
struct reglist reglist[] = {
#define FW 0 /* first register we may write */
{"modpsr", MODPSR, 0},
{"pc", PC, 0},
{"sp", SP, 0},
{"fp", FP, 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,
};
/*
* 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;
register ADDR base;
base = (ADDR)atow(aget(UOFF(u_ar0), CORF|UBLKSP));
if (base == 0)
return;
base -= USRBLK;
for (rp = reglist; rp->rname; rp++) {
rp->rval = 0;
fget((ADDR)(rp->roffs*SZREG+base),
CORF|UBLKSP, (char *)&rp->rval, SZREG);
}
}
/*
* put registers back
*/
rrest()
{
register struct reglist *rp;
register ADDR base;
if (pid == 0)
return;
base = (ADDR)atow(aget(UOFF(u_ar0), CORF|UBLKSP));
if (base == 0)
return;
base -= USRBLK;
for (rp = ®list[FW]; rp->rname; rp++)
fput((ADDR)(rp->roffs*SZREG+base),
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("%s%6t%R %16t", rp->rname, rtow(rp->rval));
valpr(rtow(rp->rval), (rp->roffs == PC) ? INSTSP : DATASP);
printc(EOR);
}
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);
}