Annotation of 42BSD/lib/libc/vax/csu/mon.c, revision 1.1.1.1

1.1       root        1: static char *sccsid = "@(#)mon.c       4.9 (Berkeley) 7/26/83";
                      2: 
                      3: #define ARCDENSITY     5       /* density of routines */
                      4: #define MINARCS                50      /* minimum number of counters */
                      5: #define        HISTFRACTION    2       /* fraction of text space for histograms */
                      6: 
                      7: 
                      8: struct phdr {
                      9:        int *lpc;
                     10:        int *hpc;
                     11:        int ncnt;
                     12: };
                     13: 
                     14: struct cnt {
                     15:        int *pc;
                     16:        long ncall;
                     17: } *countbase;
                     18: 
                     19: static int cntrs = 0;
                     20: static int profiling = 3;
                     21: static char *s_sbuf;
                     22: static int s_bufsiz;
                     23: static int s_scale;
                     24: static char *s_lowpc;
                     25: 
                     26: int numctrs;
                     27: 
                     28: #define        MSG "No space for monitor buffer(s)\n"
                     29: 
                     30: monstartup(lowpc, highpc)
                     31:        char *lowpc;
                     32:        char *highpc;
                     33: {
                     34:        int monsize;
                     35:        char *buffer;
                     36:        int cntsiz;
                     37:        extern char *sbrk();
                     38:        extern char *minbrk;
                     39: 
                     40: 
                     41:        cntsiz = (highpc - lowpc) * ARCDENSITY / 100;
                     42:        if (cntsiz < MINARCS)
                     43:                cntsiz = MINARCS;
                     44:        monsize = (highpc - lowpc + HISTFRACTION - 1) / HISTFRACTION
                     45:                + sizeof(struct phdr) + cntsiz * sizeof(struct cnt);
                     46:        monsize = (monsize + 1) & ~1;
                     47:        buffer = sbrk(monsize);
                     48:        if (buffer == (char *)-1) {
                     49:                write(2, MSG, sizeof(MSG));
                     50:                return;
                     51:        }
                     52:        minbrk = sbrk(0);
                     53:        monitor(lowpc, highpc, buffer, monsize, cntsiz);
                     54: }
                     55: 
                     56: /*
                     57:  *     This routine is massaged so that it may be jsb'ed to
                     58:  */
                     59: asm(".text");
                     60: asm("#the beginning of mcount()");
                     61: asm(".data");
                     62: mcount()
                     63: {
                     64:        register int *selfpc;   /* r11 */
                     65:        register long **cntp;   /* r10 */
                     66: 
                     67: #ifdef lint
                     68:        selfpc = (int *) 0;
                     69: #else not lint
                     70:        /*
                     71:         * find the return address for mcount,
                     72:         * and address of counter pointer
                     73:         */
                     74:        asm("   movl    (sp),r11");     /* selfpc = ... (jsb frame) */
                     75:        asm("   movl    r0,r10");       /* address of count local */
                     76: #endif not lint
                     77:        /*
                     78:         * check that we aren't recursively invoked.
                     79:         */
                     80:        if (profiling)
                     81:                goto out;
                     82:        profiling++;
                     83:        /*
                     84:         * check that counter is allocated
                     85:         */
                     86:        if (*cntp == 0) {
                     87:                /*
                     88:                 * check that a counter is available
                     89:                 */
                     90:                if (cntrs++ == numctrs)
                     91:                        goto overflow;
                     92:                countbase->pc = selfpc;
                     93:                *cntp = &countbase->ncall;
                     94:                countbase++;
                     95:        }
                     96:        (**cntp)++;
                     97:        profiling--;
                     98: out:
                     99:        asm( "  rsb" );
                    100: 
                    101: overflow:
                    102: #   define     TOLIMIT "mcount: counter overflow\n"
                    103:        write( 2 , TOLIMIT , sizeof( TOLIMIT ) );
                    104:        goto out;
                    105: }
                    106: asm(".text");
                    107: asm("#the end of mcount()");
                    108: asm(".data");
                    109: 
                    110: monitor(lowpc, highpc, buf, bufsiz, cntsiz)
                    111:        char *lowpc, *highpc;
                    112:        char *buf;
                    113:        int bufsiz, cntsiz;
                    114: {
                    115:        register int o;
                    116:        struct phdr *php;
                    117:        static int ssiz;
                    118:        static char *sbuf;
                    119: 
                    120:        if (lowpc == 0) {
                    121:                moncontrol(0);
                    122:                o = creat("mon.out", 0666);
                    123:                write(o, sbuf, ssiz);
                    124:                close(o);
                    125:                return;
                    126:        }
                    127:        sbuf = buf;
                    128:        ssiz = bufsiz;
                    129:        php = (struct phdr *)&buf[0];
                    130:        php->lpc = (int *)lowpc;
                    131:        php->hpc = (int *)highpc;
                    132:        php->ncnt = cntsiz;
                    133:        numctrs = cntsiz;
                    134:        countbase = (struct cnt *)(buf + sizeof(struct phdr));
                    135:        o = sizeof(struct phdr) + cntsiz * sizeof(struct cnt);
                    136:        buf += o;
                    137:        bufsiz -= o;
                    138:        if (bufsiz <= 0)
                    139:                return;
                    140:        o = (highpc - lowpc);
                    141:        if(bufsiz < o)
                    142:                o = ((float) bufsiz / o) * 65536;
                    143:        else
                    144:                o = 65536;
                    145:        s_scale = o;
                    146:        s_sbuf = buf;
                    147:        s_bufsiz = bufsiz;
                    148:        s_lowpc = lowpc;
                    149:        moncontrol(1);
                    150: }
                    151: 
                    152: /*
                    153:  * Control profiling
                    154:  *     profiling is what mcount checks to see if
                    155:  *     all the data structures are ready.
                    156:  */
                    157: moncontrol(mode)
                    158:     int mode;
                    159: {
                    160:     if (mode) {
                    161:        /* start */
                    162:        profil(s_sbuf, s_bufsiz, s_lowpc, s_scale);
                    163:        profiling = 0;
                    164:     } else {
                    165:        /* stop */
                    166:        profil((char *)0, 0, 0, 0);
                    167:        profiling = 3;
                    168:     }
                    169: }

unix.superglobalmegacorp.com

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