126422Ssam #ifndef lint
2*29663Ssam static char sccsid[] = "@(#)print.c 1.2 (Berkeley) 07/25/86";
326422Ssam #endif
426422Ssam /*
526422Ssam *
626422Ssam * UNIX debugger
726422Ssam *
826422Ssam */
926422Ssam #include "defs.h"
1026422Ssam
1126422Ssam MSG LONGFIL;
1226422Ssam MSG NOTOPEN;
1326422Ssam MSG BADMOD;
1426422Ssam
1526422Ssam MAP txtmap;
1626422Ssam MAP datmap;
1726422Ssam
1826422Ssam ADDR lastframe;
1926422Ssam ADDR callpc;
2026422Ssam
2126422Ssam INT infile;
2226422Ssam INT outfile;
2326422Ssam CHAR *lp;
2426422Ssam ADDR maxoff;
2526422Ssam L_INT maxpos;
2626422Ssam INT radix;
2726422Ssam
2826422Ssam /* symbol management */
2926422Ssam ADDR localval;
3026422Ssam
3126422Ssam /* breakpoints */
3226422Ssam BKPTR bkpthead;
3326422Ssam
3426422Ssam REGLIST reglist[] = {
3526422Ssam "p2lr", P2LR, &pcb.pcb_p2lr,
3626422Ssam "p2br", P2BR, (int *)&pcb.pcb_p2br,
3726422Ssam "p0lr", P0LR, &pcb.pcb_p0lr,
3826422Ssam "p0br", P0BR, (int *)&pcb.pcb_p0br,
3926422Ssam "ksp", KSP, &pcb.pcb_ksp,
4026422Ssam "hfs", HFS, &pcb.pcb_hfs,
4126422Ssam "psl", PSL, &pcb.pcb_psl,
4226422Ssam "pc", PC, &pcb.pcb_pc,
4326422Ssam "ach", ACHI, &pcb.pcb_ach,
4426422Ssam "acl", ACLO, &pcb.pcb_acl,
4526422Ssam "usp", USP, &pcb.pcb_usp,
4626422Ssam "fp", FP, &pcb.pcb_fp,
4726422Ssam "r12", R12, &pcb.pcb_r12,
4826422Ssam "r11", R11, &pcb.pcb_r11,
4926422Ssam "r10", R10, &pcb.pcb_r10,
5026422Ssam "r9", R9, &pcb.pcb_r9,
5126422Ssam "r8", R8, &pcb.pcb_r8,
5226422Ssam "r7", R7, &pcb.pcb_r7,
5326422Ssam "r6", R6, &pcb.pcb_r6,
5426422Ssam "r5", R5, &pcb.pcb_r5,
5526422Ssam "r4", R4, &pcb.pcb_r4,
5626422Ssam "r3", R3, &pcb.pcb_r3,
5726422Ssam "r2", R2, &pcb.pcb_r2,
5826422Ssam "r1", R1, &pcb.pcb_r1,
5926422Ssam "r0", R0, &pcb.pcb_r0,
6026422Ssam 0
6126422Ssam };
6226422Ssam
6326422Ssam char lastc;
6426422Ssam
6526422Ssam INT fcor;
6626422Ssam STRING errflg;
6726422Ssam INT signo;
6826422Ssam INT sigcode;
6926422Ssam
7026422Ssam
7126422Ssam L_INT dot;
7226422Ssam L_INT var[];
7326422Ssam STRING symfil;
7426422Ssam STRING corfil;
7526422Ssam L_INT pid;
7626422Ssam L_INT adrval;
7726422Ssam INT adrflg;
7826422Ssam L_INT cntval;
7926422Ssam INT cntflg;
8026422Ssam
8126422Ssam STRING signals[] = {
8226422Ssam "",
8326422Ssam "hangup",
8426422Ssam "interrupt",
8526422Ssam "quit",
8626422Ssam "illegal instruction",
8726422Ssam "trace/BPT",
8826422Ssam "IOT",
8926422Ssam "EMT",
9026422Ssam "floating exception",
9126422Ssam "killed",
9226422Ssam "bus error",
9326422Ssam "memory fault",
9426422Ssam "bad system call",
9526422Ssam "broken pipe",
9626422Ssam "alarm call",
9726422Ssam "terminated",
9826422Ssam "signal 16",
9926422Ssam "stop (signal)",
10026422Ssam "stop (tty)",
10126422Ssam "continue (signal)",
10226422Ssam "child termination",
10326422Ssam "stop (tty input)",
10426422Ssam "stop (tty output)",
10526422Ssam "input available (signal)",
10626422Ssam "cpu timelimit",
10726422Ssam "file sizelimit",
10826422Ssam "signal 26",
10926422Ssam "signal 27",
11026422Ssam "signal 28",
11126422Ssam "signal 29",
11226422Ssam "signal 30",
11326422Ssam "signal 31",
11426422Ssam };
11526422Ssam
11626422Ssam /* general printing routines ($) */
11726422Ssam
printtrace(modif)11826422Ssam printtrace(modif)
11926422Ssam {
12026422Ssam REG narg, i;
12126422Ssam REG BKPTR bkptr;
12226422Ssam REG ADDR word;
12326422Ssam REG STRING comptr;
12426422Ssam REG ADDR argp, frame;
12526422Ssam register struct nlist *sp;
12626422Ssam INT stack, ntramp;
12726422Ssam
12826422Ssam IF cntflg==0 THEN cntval = -1; FI
12926422Ssam
13026422Ssam switch (modif) {
13126422Ssam
13226422Ssam case '<':
13326422Ssam IF cntval == 0
13426422Ssam THEN WHILE readchar() != EOR
13526422Ssam DO OD
13626422Ssam lp--;
13726422Ssam break;
13826422Ssam FI
13926422Ssam IF rdc() == '<'
14026422Ssam THEN stack = 1;
14126422Ssam ELSE stack = 0; lp--;
14226422Ssam FI
14326422Ssam /* fall through */
14426422Ssam case '>':
14526422Ssam {CHAR file[64];
14626422Ssam CHAR Ifile[128];
14726422Ssam extern CHAR *Ipath;
14826422Ssam INT index;
14926422Ssam
15026422Ssam index=0;
15126422Ssam IF modif=='<'
15226422Ssam THEN iclose(stack, 0);
15326422Ssam ELSE oclose();
15426422Ssam FI
15526422Ssam IF rdc()!=EOR
15626422Ssam THEN REP file[index++]=lastc;
15726422Ssam IF index>=63 THEN error(LONGFIL); FI
15826422Ssam PER readchar()!=EOR DONE
15926422Ssam file[index]=0;
16026422Ssam IF modif=='<'
16126422Ssam THEN IF Ipath THEN
16226422Ssam strcpy(Ifile, Ipath);
16326422Ssam strcat(Ifile, "/");
16426422Ssam strcat(Ifile, file);
16526422Ssam FI
16626422Ssam infile=open(file,0);
16726422Ssam IF infile<0 && (infile=open(Ifile,0))<0
16826422Ssam THEN infile=0; error(NOTOPEN);
16926422Ssam ELSE IF cntflg
17026422Ssam THEN var[9] = cntval;
17126422Ssam ELSE var[9] = 1;
17226422Ssam FI
17326422Ssam FI
17426422Ssam ELSE outfile=open(file,1);
17526422Ssam IF outfile<0
17626422Ssam THEN outfile=creat(file,0644);
17726422Ssam #ifndef EDDT
17826422Ssam ELSE lseek(outfile,0L,2);
17926422Ssam #endif
18026422Ssam FI
18126422Ssam FI
18226422Ssam
18326422Ssam ELSE IF modif == '<'
18426422Ssam THEN iclose(-1, 0);
18526422Ssam FI
18626422Ssam FI
18726422Ssam lp--;
18826422Ssam }
18926422Ssam break;
19026422Ssam
19126422Ssam case 'p':
19226422Ssam IF kernel == 0 THEN
19326422Ssam printf("not debugging kernel\n");
19426422Ssam ELSE
19526422Ssam IF adrflg THEN
19626422Ssam int pte = access(RD, dot, DSP, 0);
19726422Ssam masterpcbb = (pte&PG_PFNUM)*NBPG;
19826422Ssam FI
19926422Ssam getpcb();
20026422Ssam FI
20126422Ssam break;
20226422Ssam
20326422Ssam case 'd':
20426422Ssam if (adrflg) {
20526422Ssam if (!(adrval>=2 && adrval<=16 || adrval<=-2 && adrval>=-16)) {
20626422Ssam printf("illegal radix %d base ten",radix);
20726422Ssam break;
20826422Ssam }
20926422Ssam radix=adrval;
21026422Ssam }
21126422Ssam printf("radix=%d base ten",radix);
21226422Ssam break;
21326422Ssam
21426422Ssam case 'q': case 'Q': case '%':
21526422Ssam done();
21626422Ssam
21726422Ssam case 'w': case 'W':
21826422Ssam maxpos=(adrflg?adrval:MAXPOS);
21926422Ssam break;
22026422Ssam
22126422Ssam case 's': case 'S':
22226422Ssam maxoff=(adrflg?adrval:MAXOFF);
22326422Ssam break;
22426422Ssam
22526422Ssam case 'v': case 'V':
22626422Ssam printf("variables\n");
22726422Ssam FOR i=0;i<=35;i++
22826422Ssam DO IF var[i]
22926422Ssam THEN printc((i<=9 ? '0' : 'a'-10) + i);
23026422Ssam printf(" = %R\n",var[i]);
23126422Ssam FI
23226422Ssam OD
23326422Ssam break;
23426422Ssam
23526422Ssam case 'm': case 'M':
23626422Ssam printmap("? map",&txtmap);
23726422Ssam printmap("/ map",&datmap);
23826422Ssam break;
23926422Ssam
24026422Ssam case 0: case '?':
24126422Ssam IF pid
24226422Ssam THEN printf("pcs id = %d\n",pid);
24326422Ssam ELSE printf("no process\n");
24426422Ssam FI
24526422Ssam sigprint(); flushbuf();
24626422Ssam
24726422Ssam case 'r': case 'R':
24826422Ssam printregs(modif);
24926422Ssam return;
25026422Ssam
25126422Ssam case 'c': case 'C':
25226422Ssam IF adrflg
25326422Ssam THEN frame=adrval;
25426422Ssam callpc=get(frame-8,DSP);
25526422Ssam ELIF kcore THEN
25626422Ssam frame = pcb.pcb_fp;
25726422Ssam callpc = pcb.pcb_pc;
25826422Ssam ELSE
25926422Ssam frame = *(ADDR *)(((ADDR)(&u))+FP);
26026422Ssam callpc = *(ADDR *)(((ADDR)(&u))+PC);
26126422Ssam FI
26226422Ssam lastframe=0;
26326422Ssam ntramp = 0;
26426422Ssam WHILE cntval-- ANDF frame!=0
26526422Ssam DO char *name;
26626422Ssam chkerr();
26726422Ssam /* check for pc in pcb (signal trampoline code) */
26826422Ssam if (MAXSTOR < callpc && callpc < MAXSTOR+ctob(UPAGES)) {
26926422Ssam name = "sigtramp";
27026422Ssam ntramp++;
27126422Ssam } else {
27226422Ssam ntramp = 0;
27326422Ssam findsym(callpc,ISYM);
27426422Ssam if (cursym &&
27526422Ssam !strcmp(cursym->n_un.n_name, "start"))
27626422Ssam break;
27726422Ssam if (cursym)
27826422Ssam name = cursym->n_un.n_name;
27926422Ssam else
28026422Ssam name = "?";
28126422Ssam }
28226422Ssam printf("%s(", name);
28326422Ssam narg = ((get(frame-4, DSP)&0xffff)-4)/4;
28426422Ssam argp = frame;
28526422Ssam IF ntramp != 1 THEN
28626422Ssam LOOP IF narg==0 THEN break; FI
28726422Ssam printf("%R", get(argp += 4, DSP));
28826422Ssam IF --narg!=0 THEN printc(','); FI
28926422Ssam POOL
29026422Ssam FI
29126422Ssam printf(") at ");
29226422Ssam psymoff(callpc, ISYM, "\n");
29326422Ssam
29426422Ssam IF modif=='C'
29526422Ssam THEN WHILE localsym(frame,argp)
29626422Ssam DO word=get(localval,DSP);
29726422Ssam printf("%8t%s:%10t", cursym->n_un.n_name);
29826422Ssam IF errflg THEN printf("?\n"); errflg=0;
29926422Ssam ELSE printf("%R\n",word); FI
30026422Ssam OD
30126422Ssam FI
30226422Ssam
30326422Ssam if (ntramp != 1) {
30426422Ssam callpc = get(frame-8, DSP);
30526422Ssam lastframe = frame;
30626422Ssam frame = get(frame, DSP)&ALIGN;
30726422Ssam } else
30826422Ssam callpc = get(lastframe+44, DSP);
30926422Ssam IF !adrflg ANDF !INSTACK(frame)
31026422Ssam THEN break; FI
31126422Ssam OD
31226422Ssam break;
31326422Ssam
31426422Ssam /*print externals*/
31526422Ssam case 'e': case 'E':
31626422Ssam for (sp = symtab; sp < esymtab; sp++) {
31726422Ssam if (sp->n_type==(N_DATA|N_EXT) ORF sp->n_type==(N_BSS|N_EXT))
31826422Ssam printf("%s:%12t%R\n", sp->n_un.n_name, get(sp->n_value,DSP));
31926422Ssam }
32026422Ssam break;
32126422Ssam
32226422Ssam /*print breakpoints*/
32326422Ssam case 'b': case 'B':
32426422Ssam printf("breakpoints\ncount%8tbkpt%24tcommand\n");
32526422Ssam for (bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt)
32626422Ssam if (bkptr->flag) {
32726422Ssam printf("%-8.8d",bkptr->count);
32826422Ssam psymoff(bkptr->loc,ISYM,"%24t");
32926422Ssam comptr=bkptr->comm;
33026422Ssam WHILE *comptr DO printc(*comptr++); OD
33126422Ssam }
33226422Ssam break;
33326422Ssam
33426422Ssam default: error(BADMOD);
33526422Ssam }
33626422Ssam
33726422Ssam }
33826422Ssam
printmap(s,amap)33926422Ssam printmap(s,amap)
34026422Ssam STRING s; REG MAP *amap;
34126422Ssam {
34226422Ssam int file;
34326422Ssam file=amap->ufd;
34426422Ssam printf("%s%12t`%s'\n",s,(file<0 ? "-" : (file==fcor ? corfil : symfil)));
34526422Ssam printf("b1 = %-16R",amap->b1);
34626422Ssam printf("e1 = %-16R",amap->e1);
34726422Ssam printf("f1 = %-16R",amap->f1);
34826422Ssam printf("\nb2 = %-16R",amap->b2);
34926422Ssam printf("e2 = %-16R",amap->e2);
35026422Ssam printf("f2 = %-16R",amap->f2);
35126422Ssam printc(EOR);
35226422Ssam }
35326422Ssam
printregs(c)35426422Ssam printregs(c)
35526422Ssam {
35626422Ssam REG REGPTR p;
35726422Ssam ADDR v;
35826422Ssam
35926422Ssam FOR p=reglist; p->rname; p++
36026422Ssam DO
36126422Ssam if(c!='R' && p->roffs!=PSL)
36226422Ssam continue;
36326422Ssam c = 'R';
36426422Ssam v = kcore ? *p->rkern : *(ADDR *)(((ADDR)&u)+p->roffs);
36526422Ssam printf("%s%6t%R %16t", p->rname, v);
36626422Ssam valpr(v,(p->roffs==PC?ISYM:DSYM));
36726422Ssam printc(EOR);
36826422Ssam OD
36926422Ssam printpc();
37026422Ssam }
37126422Ssam
getreg(regnam)37226422Ssam getreg(regnam)
37326422Ssam {
37426422Ssam REG REGPTR p;
37526422Ssam REG STRING regptr;
37626422Ssam CHAR *olp;
37726422Ssam
37826422Ssam olp=lp;
37926422Ssam FOR p=reglist; p->rname; p++
38026422Ssam DO regptr=p->rname;
38126422Ssam IF (regnam == *regptr++)
38226422Ssam THEN
38326422Ssam WHILE *regptr
38426422Ssam DO IF readchar() != *regptr++
38526422Ssam THEN --regptr; break;
38626422Ssam FI
38726422Ssam OD
38826422Ssam IF *regptr
38926422Ssam THEN lp=olp;
39026422Ssam ELSE return(kcore ? (int)p->rkern : p->roffs);
39126422Ssam FI
39226422Ssam FI
39326422Ssam OD
39426422Ssam lp=olp;
395*29663Ssam return(-1);
39626422Ssam }
39726422Ssam
printpc()39826422Ssam printpc()
39926422Ssam {
40026422Ssam dot= *(ADDR *)(((ADDR)(&u))+PC);
40126422Ssam psymoff(dot,ISYM,":%16t"); printins(ISP,chkget(dot,ISP));
40226422Ssam printc(EOR);
40326422Ssam }
40426422Ssam
40526422Ssam char *illinames[] = {
40626422Ssam "reserved addressing fault",
40726422Ssam "priviliged instruction fault",
40826422Ssam "reserved operand fault"
40926422Ssam };
41026422Ssam char *fpenames[] = {
41126422Ssam 0,
41226422Ssam "integer overflow trap",
41326422Ssam "integer divide by zero trap",
41426422Ssam /* not valid
41526422Ssam "floating overflow trap",
41626422Ssam "floating/decimal divide by zero trap",
41726422Ssam "floating underflow trap",
41826422Ssam "decimal overflow trap",
41926422Ssam "subscript out of range trap",
42026422Ssam "floating overflow fault",
42126422Ssam "floating divide by zero fault",
42226422Ssam "floating undeflow fault"
42326422Ssam */
42426422Ssam };
42526422Ssam
sigprint()42626422Ssam sigprint()
42726422Ssam {
42826422Ssam IF (signo>=0) ANDF (signo<sizeof signals/sizeof signals[0])
42926422Ssam THEN printf(signals[signo]); FI
43026422Ssam switch (signo) {
43126422Ssam
43226422Ssam case SIGFPE:
43326422Ssam IF (sigcode > 0 &&
43426422Ssam sigcode < sizeof fpenames / sizeof fpenames[0]) THEN
43526422Ssam printf(" ("); printf(fpenames[sigcode]); printc(')');
43626422Ssam FI
43726422Ssam break;
43826422Ssam
43926422Ssam case SIGILL:
44026422Ssam IF (sigcode >= 0 &&
44126422Ssam sigcode < sizeof illinames / sizeof illinames[0]) THEN
44226422Ssam printf(" ("); printf(illinames[sigcode]); printc(')');
44326422Ssam FI
44426422Ssam break;
44526422Ssam }
44626422Ssam }
447