|
|
1.1 ! root 1: /* ctrace() */ ! 2: if (adrflg) { ! 3: frame=adrval; ! 4: word=sget((ADDR)adrval+6,CORF|DATASP); ! 5: if (word&0x2000) { /* 'calls', can figure out argp */ ! 6: argp=adrval+20+((word>>14)&3); ! 7: word &= 0xFFF; ! 8: while (word) { ! 9: if (word&1) ! 10: argp+=4; ! 11: word>>=1; ! 12: } ! 13: } else { /* 'callg', can't tell where argp is */ ! 14: argp=frame; ! 15: } ! 16: callpc=atow(aget(frame+16,CORF|DATASP)); ! 17: } else { ! 18: argp= (ADDR)rtow(rget(AP)); ! 19: frame= (ADDR)rtow(rget(FP)); ! 20: callpc= (ADDR)rtow(rget(PC)); ! 21: } ! 22: lastframe=0; ! 23: ntramp = 0; ! 24: while (cntval--) { ! 25: char *name; ! 26: chkerr(); ! 27: if (callpc > 0x80000000 - 0x200 * UPAGES) { ! 28: name = "sigtramp"; ! 29: ntramp++; ! 30: } else { ! 31: ntramp = 0; ! 32: findsym((WORD)callpc,ISYM); ! 33: if (cursym && ! 34: !strcmp(cursym->n_un.n_name, "start")) ! 35: break; ! 36: if (cursym) ! 37: name = cursym->n_un.n_name; ! 38: else ! 39: name = "?"; ! 40: } ! 41: printf("%s(", name); ! 42: narg = cget(argp,CORF|DATASP); ! 43: if (narg&~0xFF) ! 44: narg=0; ! 45: for (;;) { ! 46: if (narg==0) ! 47: break; ! 48: printf("%R", lget(argp += 4, CORF|DATASP)); ! 49: if (--narg!=0) ! 50: printc(','); ! 51: } ! 52: printf(") from %X\n",callpc); /* jkf mod */ ! 53: ! 54: if (modif=='C') { ! 55: while (localsym(frame,argp)) { ! 56: word=lget(localval,CORF|DATASP); ! 57: printf("%8t%s:%10t", cursym->n_un.n_name); ! 58: if (errflg) { ! 59: prints("?\n"); ! 60: errflg=0; ! 61: } else { ! 62: printf("%R\n",word); ! 63: } ! 64: } ! 65: } ! 66: if (ntramp == 1) ! 67: callpc=atow(aget(frame+64, CORF|DATASP)); ! 68: else ! 69: callpc=atow(aget(frame+16, CORF|DATASP)); ! 70: argp=atow(aget(frame+8, CORF|DATASP)); ! 71: lastframe=frame; ! 72: frame=atow(aget(frame+12, CORF|DATASP))&EVEN; ! 73: if (frame==0 || (!adrflg && !INSTACK(frame))) ! 74: break; ! 75: } ! 76: break; ! 77:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.