|
|
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.