Annotation of lucent/sys/src/9/port/devkprof.c, revision 1.1.1.1

1.1       root        1: #include       "u.h"
                      2: #include       "../port/lib.h"
                      3: #include       "mem.h"
                      4: #include       "dat.h"
                      5: #include       "fns.h"
                      6: #include       "../port/error.h"
                      7: 
                      8: #include       "devtab.h"
                      9: 
                     10: #define        LRES    3               /* log of PC resolution */
                     11: #define        SZ      4               /* sizeof of count cell; well known as 4 */
                     12: 
                     13: struct
                     14: {
                     15:        int     minpc;
                     16:        int     maxpc;
                     17:        int     nbuf;
                     18:        int     time;
                     19:        ulong   *buf;
                     20: }kprof;
                     21: 
                     22: enum{
                     23:        Kprofdirqid,
                     24:        Kprofdataqid,
                     25:        Kprofctlqid,
                     26:        Nkproftab=Kprofctlqid,
                     27:        Kprofmaxqid,
                     28: };
                     29: Dirtab kproftab[Nkproftab]={
                     30:        "kpdata",       {Kprofdataqid},         0,      0600,
                     31:        "kpctl",        {Kprofctlqid},          0,      0600,
                     32: };
                     33: 
                     34: void kproftimer(ulong);
                     35: 
                     36: void
                     37: kprofreset(void)
                     38: {
                     39: }
                     40: 
                     41: void
                     42: kprofinit(void)
                     43: {
                     44:        if(SZ != sizeof kprof.buf[0])
                     45:                panic("kprof size");
                     46: }
                     47: 
                     48: Chan *
                     49: kprofattach(char *spec)
                     50: {
                     51:        ulong n;
                     52: 
                     53:        /* allocate when first used */
                     54:        kprof.minpc = KTZERO;
                     55:        kprof.maxpc = (ulong)etext;
                     56:        kprof.nbuf = (kprof.maxpc-kprof.minpc) >> LRES;
                     57:        n = kprof.nbuf*SZ;
                     58:        if(kprof.buf == 0) {
                     59:                kprof.buf = xalloc(n);
                     60:                if(kprof.buf == 0)
                     61:                        error(Enomem);
                     62:        }
                     63:        kproftab[0].length = n;
                     64:        return devattach('T', spec);
                     65: }
                     66: Chan *
                     67: kprofclone(Chan *c, Chan *nc)
                     68: {
                     69:        return devclone(c, nc);
                     70: }
                     71: 
                     72: int
                     73: kprofwalk(Chan *c, char *name)
                     74: {
                     75:        return devwalk(c, name, kproftab, (long)Nkproftab, devgen);
                     76: }
                     77: 
                     78: void
                     79: kprofstat(Chan *c, char *db)
                     80: {
                     81:        devstat(c, db, kproftab, (long)Nkproftab, devgen);
                     82: }
                     83: 
                     84: Chan *
                     85: kprofopen(Chan *c, int omode)
                     86: {
                     87:        if(c->qid.path == CHDIR){
                     88:                if(omode != OREAD)
                     89:                        error(Eperm);
                     90:        }
                     91:        c->mode = openmode(omode);
                     92:        c->flag |= COPEN;
                     93:        c->offset = 0;
                     94:        return c;
                     95: }
                     96: 
                     97: void
                     98: kprofcreate(Chan *c, char *name, int omode, ulong perm)
                     99: {
                    100:        USED(c, name, omode, perm);
                    101:        error(Eperm);
                    102: }
                    103: 
                    104: void
                    105: kprofremove(Chan *c)
                    106: {
                    107:        USED(c);
                    108:        error(Eperm);
                    109: }
                    110: 
                    111: void
                    112: kprofwstat(Chan *c, char *dp)
                    113: {
                    114:        USED(c, dp);
                    115:        error(Eperm);
                    116: }
                    117: 
                    118: void
                    119: kprofclose(Chan *c)
                    120: {
                    121:        USED(c);
                    122: }
                    123: 
                    124: long
                    125: kprofread(Chan *c, void *va, long n, ulong offset)
                    126: {
                    127:        ulong tabend;
                    128:        ulong w, *bp;
                    129:        uchar *a, *ea;
                    130: 
                    131:        switch(c->qid.path & ~CHDIR){
                    132:        case Kprofdirqid:
                    133:                return devdirread(c, va, n, kproftab, Nkproftab, devgen);
                    134: 
                    135:        case Kprofdataqid:
                    136:                tabend = kprof.nbuf*SZ;
                    137:                if(offset & (SZ-1))
                    138:                        error(Ebadarg);
                    139:                if(offset >= tabend){
                    140:                        n = 0;
                    141:                        break;
                    142:                }
                    143:                if(offset+n > tabend)
                    144:                        n = tabend-offset;
                    145:                n &= ~(SZ-1);
                    146:                a = va;
                    147:                ea = a + n;
                    148:                bp = kprof.buf + offset/SZ;
                    149:                while(a < ea){
                    150:                        w = *bp++;
                    151:                        *a++ = w>>24;
                    152:                        *a++ = w>>16;
                    153:                        *a++ = w>>8;
                    154:                        *a++ = w>>0;
                    155:                }
                    156:                break;
                    157: 
                    158:        default:
                    159:                n = 0;
                    160:                break;
                    161:        }
                    162:        return n;
                    163: }
                    164: 
                    165: long
                    166: kprofwrite(Chan *c, char *a, long n, ulong offset)
                    167: {
                    168:        USED(offset);
                    169: 
                    170:        switch((int)(c->qid.path&~CHDIR)){
                    171:        case Kprofctlqid:
                    172:                if(strncmp(a, "startclr", 8) == 0){
                    173:                        memset((char *)kprof.buf, 0, kprof.nbuf*SZ);
                    174:                        kprof.time = 1;
                    175:                }else if(strncmp(a, "start", 5) == 0)
                    176:                        kprof.time = 1;
                    177:                else if(strncmp(a, "stop", 4) == 0)
                    178:                        kprof.time = 0;
                    179:                else
                    180:                        error(Ebadctl);
                    181:                break;
                    182:        default:
                    183:                error(Ebadusefd);
                    184:        }
                    185:        return n;
                    186: }
                    187: 
                    188: void
                    189: kproftimer(ulong pc)
                    190: {
                    191:        extern void spldone(void);
                    192: 
                    193:        if(kprof.time == 0)
                    194:                return;
                    195:        /*
                    196:         *  if the pc is coming out of spllo or splx,
                    197:         *  use the pc saved when we went splhi.
                    198:         */
                    199:        if(pc>=(ulong)splx && pc<=(ulong)spldone)
                    200:                pc = m->splpc;
                    201: 
                    202:        kprof.buf[0] += TK2MS(1);
                    203:        if(kprof.minpc<=pc && pc<kprof.maxpc){
                    204:                pc -= kprof.minpc;
                    205:                pc >>= LRES;
                    206:                kprof.buf[pc] += TK2MS(1);
                    207:        }else
                    208:                kprof.buf[1] += TK2MS(1);
                    209: }

unix.superglobalmegacorp.com

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