Annotation of researchv8dc/cmd/adb/ctrace, revision 1.1.1.1

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.