|
|
Power 6/32 Unix version 1.21
/*
*
* UNIX debugger
*
*/
#include "defs.h"
MSG LONGFIL;
MSG NOTOPEN;
MSG BADMOD;
MAP txtmap;
MAP datmap;
ADDR lastframe;
ADDR callpc;
INT infile;
INT outfile;
CHAR *lp;
L_INT maxoff;
L_INT maxpos;
INT radix;
/* symbol management */
L_INT localval;
/* breakpoints */
BKPTR bkpthead;
REGLIST reglist [] = {
"p2lr", P2LR,
"p2br",P2BR,
"p0lr", P0LR,
"p0br",P0BR,
"ksp",KSP,
"hfs", HFS,
"psl", PSL,
"pc", PC,
"ach", ACHI,
"acl", ACLO,
"usp",USP,
"fp", FP,
"r12", R12,
"r11", R11,
"r10", R10,
"r9", R9,
"r8", R8,
"r7", R7,
"r6", R6,
"r5", R5,
"r4", R4,
"r3", R3,
"r2", R2,
"r1", R1,
"r0", R0,
0
};
char lastc;
INT fcor;
STRING errflg;
INT signo;
INT sigcode;
L_INT dot;
L_INT var[];
STRING symfil;
STRING corfil;
L_INT pid;
L_INT adrval;
INT adrflg;
L_INT cntval;
INT cntflg;
STRING signals[] = {
"",
"hangup",
"interrupt",
"quit",
"illegal instruction",
"trace/BPT",
"IOT",
"EMT",
"floating exception",
"killed",
"bus error",
"memory fault",
"bad system call",
"broken pipe",
"alarm call",
"terminated",
"signal 16",
"stop (signal)",
"stop (tty)",
"continue (signal)",
"child termination",
"stop (tty input)",
"stop (tty output)",
"input available (signal)",
"cpu timelimit",
"file sizelimit",
"signal 26",
"signal 27",
"signal 28",
"signal 29",
"signal 30",
"signal 31",
};
/* general printing routines ($) */
printtrace(modif)
{
REG narg, i;
REG BKPTR bkptr;
REG ADDR word;
REG STRING comptr;
REG ADDR argp, frame;
register struct nlist *sp;
IF cntflg==0 THEN cntval = -1; FI
switch (modif) {
case '<':
IF cntval == 0
THEN WHILE readchar() != EOR
DO OD
lp--;
break;
FI
/* fall through */
case '>':
{CHAR file[64];
INT index;
index=0;
IF modif=='<'
THEN iclose();
ELSE oclose();
FI
IF rdc()!=EOR
THEN REP file[index++]=lastc;
IF index>=63 THEN error(LONGFIL); FI
PER readchar()!=EOR DONE
file[index]=0;
IF modif=='<'
THEN infile=open(file,0);
IF infile<0
THEN infile=0; error(NOTOPEN);
ELSE IF cntflg
THEN var[9] = cntval;
ELSE var[9] = 1;
FI
FI
ELSE outfile=open(file,1);
IF outfile<0
THEN outfile=creat(file,0644);
#ifndef EDDT
ELSE lseek(outfile,0L,2);
#endif
FI
FI
ELSE IF modif == '<'
THEN iclose();
FI
FI
lp--;
}
break;
case 'd':
if (adrflg) {
if (!(adrval>=2 && adrval<=16 || adrval<=-2 && adrval>=-16)) {
printf("illegal radix %d base ten",radix);
break;
}
radix=adrval;
}
printf("radix=%d base ten",radix);
break;
case 'q': case 'Q': case '%':
done();
case 'w': case 'W':
maxpos=(adrflg?adrval:MAXPOS);
break;
case 's': case 'S':
maxoff=(adrflg?adrval:MAXOFF);
break;
case 'v': case 'V':
printf("variables\n");
FOR i=0;i<=35;i++
DO IF var[i]
THEN printc((i<=9 ? '0' : 'a'-10) + i);
printf(" = %R\n",var[i]);
FI
OD
break;
case 'm': case 'M':
printmap("? map",&txtmap);
printmap("/ map",&datmap);
break;
case 0: case '?':
IF pid
THEN printf("pcs id = %d\n",pid);
ELSE printf("no process\n");
FI
sigprint(); flushbuf();
case 'r': case 'R':
printregs(modif);
return;
case 'c': case 'C':
IF adrflg
THEN frame=adrval;
callpc=get(frame-8,DSP);
ELSE
frame= uw[FP];
callpc= uw[PC];
FI
lastframe=0;
WHILE cntval-- ANDF frame!=0 ANDF frame>lastframe ANDF (adrflg ORF INSTACK(frame))
DO char *name;
chkerr();
findsym(callpc,ISYM);
if (cursym &&
!strcmp(cursym->n_un.n_name, "start"))
break;
if (cursym)
name = cursym->n_un.n_name;
else
name = "?";
printf("%s(", name);
narg = ((get(frame-4, DSP)&0xffff)-4)/4;
argp = frame;
LOOP IF narg<=0 THEN break; FI
printf("%R", get(argp += 4, DSP));
IF --narg>0 THEN printc(','); FI
POOL
printf(") at ");
psymoff(callpc, ISYM, "\n");
IF modif=='C'
THEN WHILE localsym(frame)
DO word=get(localval,DSP);
printf("%8t%s:%10t", cursym->n_un.n_name);
IF errflg THEN printf("?\n"); errflg=0; ELSE printf("%R\n",word); FI
OD
FI
callpc=get(frame-8, DSP);
if (callpc > USRSTACK) {
printf("sigtramp()\n");
callpc=get(frame+44, DSP);
}
lastframe=frame;
frame=get(frame, DSP)&ALIGN;
OD
break;
/*print externals*/
case 'e': case 'E':
for (sp = symtab; sp < esymtab; sp++) {
if (sp->n_type==(N_DATA|N_EXT) ORF sp->n_type==(N_BSS|N_EXT))
printf("%s:%12t%R\n", sp->n_un.n_name, get(sp->n_value,DSP));
}
break;
/*print breakpoints*/
case 'b': case 'B':
printf("breakpoints\ncount%8tbkpt%24tcommand\n");
for (bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt)
if (bkptr->flag) {
printf("%-8.8d",bkptr->count);
psymoff(bkptr->loc,ISYM,"%24t");
comptr=bkptr->comm;
WHILE *comptr DO printc(*comptr++); OD
}
break;
default: error(BADMOD);
}
}
printmap(s,amap)
STRING s; REG MAP *amap;
{
int file;
file=amap->ufd;
printf("%s%12t`%s'\n",s,(file<0 ? "-" : (file==fcor ? corfil : symfil)));
printf("b1 = %-16R",amap->b1);
printf("e1 = %-16R",amap->e1);
printf("f1 = %-16R",amap->f1);
printf("\nb2 = %-16R",amap->b2);
printf("e2 = %-16R",amap->e2);
printf("f2 = %-16R",amap->f2);
printc(EOR);
}
printregs(c)
{
REG REGPTR p;
L_INT v;
FOR p=reglist; p->rname; p++
DO
if(c!='R' && p->roffs!=PSL)
continue;
c = 'R';
printf("%s%6t%R %16t", p->rname, v= uw[p->roffs]);
valpr(v,(p->roffs==PC?ISYM:DSYM));
printc(EOR);
OD
printpc();
}
getreg(regnam)
{
REG REGPTR p;
REG STRING regptr;
CHAR *olp;
olp=lp;
FOR p=reglist; p->rname; p++
DO regptr=p->rname;
IF (regnam == *regptr++)
THEN
WHILE *regptr
DO IF readchar() != *regptr++
THEN --regptr; break;
FI
OD
IF *regptr
THEN lp=olp;
ELSE return(p->roffs);
FI
FI
OD
lp=olp;
return(-1);
}
printpc()
{
dot= uw[PC];
psymoff(dot,ISYM,":%16t"); printins(ISP,chkget(dot,ISP));
printc(EOR);
}
char *illinames[] = {
"reserved addressing fault",
"priviliged instruction fault",
"reserved operand fault"
};
char *fpenames[] = {
0,
"integer overflow trap",
"integer divide by zero trap",
/* not valid
"floating overflow trap",
"floating/decimal divide by zero trap",
"floating underflow trap",
"decimal overflow trap",
"subscript out of range trap",
"floating overflow fault",
"floating divide by zero fault",
"floating undeflow fault"
*/
};
sigprint()
{
IF (signo>=0) ANDF (signo<sizeof signals/sizeof signals[0])
THEN printf(signals[signo]); FI
switch (signo) {
case SIGFPE:
IF (sigcode > 0 &&
sigcode < sizeof fpenames / sizeof fpenames[0]) THEN
printf(" ("); printf(fpenames[sigcode]); printc(')');
FI
break;
case SIGILL:
IF (sigcode >= 0 &&
sigcode < sizeof illinames / sizeof illinames[0]) THEN
printf(" ("); printf(illinames[sigcode]); printc(')');
FI
break;
}
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.