|
|
researchv8 Dan Cross
/* ctrace() */
if (adrflg) {
frame=adrval;
word=sget((ADDR)adrval+6,CORF|DATASP);
if (word&0x2000) { /* 'calls', can figure out argp */
argp=adrval+20+((word>>14)&3);
word &= 0xFFF;
while (word) {
if (word&1)
argp+=4;
word>>=1;
}
} else { /* 'callg', can't tell where argp is */
argp=frame;
}
callpc=atow(aget(frame+16,CORF|DATASP));
} else {
argp= (ADDR)rtow(rget(AP));
frame= (ADDR)rtow(rget(FP));
callpc= (ADDR)rtow(rget(PC));
}
lastframe=0;
ntramp = 0;
while (cntval--) {
char *name;
chkerr();
if (callpc > 0x80000000 - 0x200 * UPAGES) {
name = "sigtramp";
ntramp++;
} else {
ntramp = 0;
findsym((WORD)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 = cget(argp,CORF|DATASP);
if (narg&~0xFF)
narg=0;
for (;;) {
if (narg==0)
break;
printf("%R", lget(argp += 4, CORF|DATASP));
if (--narg!=0)
printc(',');
}
printf(") from %X\n",callpc); /* jkf mod */
if (modif=='C') {
while (localsym(frame,argp)) {
word=lget(localval,CORF|DATASP);
printf("%8t%s:%10t", cursym->n_un.n_name);
if (errflg) {
prints("?\n");
errflg=0;
} else {
printf("%R\n",word);
}
}
}
if (ntramp == 1)
callpc=atow(aget(frame+64, CORF|DATASP));
else
callpc=atow(aget(frame+16, CORF|DATASP));
argp=atow(aget(frame+8, CORF|DATASP));
lastframe=frame;
frame=atow(aget(frame+12, CORF|DATASP))&EVEN;
if (frame==0 || (!adrflg && !INSTACK(frame)))
break;
}
break;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.