Annotation of XNU/bsd/kern/pcsamples.c, revision 1.1.1.1

1.1       root        1: #include <kern/cpu_number.h>
                      2: #include <machine/spl.h>
                      3: 
                      4: #define HZ      100
                      5: #include <mach/clock_types.h>
                      6: #include <mach/mach_types.h>
                      7: 
                      8: #include <sys/kdebug.h>
                      9: #include <sys/errno.h>
                     10: #include <sys/param.h>         /* for splhigh */
                     11: #include <sys/proc.h>
                     12: #include <sys/vm.h>
                     13: #include <sys/sysctl.h>
                     14: #include <vm/vm_kern.h>
                     15: 
                     16: 
                     17: unsigned int pc_buftomem = 0;
                     18: u_long     * pc_buffer   = 0;   /* buffer that holds each pc */
                     19: u_long     * pc_bufptr   = 0;
                     20: u_long     * pc_buflast  = 0;
                     21: u_long     * pc_readlast = 0;
                     22: unsigned int npcbufs         = 8192;      /* number of pc entries in buffer */
                     23: unsigned int pc_bufsize      = 0;
                     24: unsigned int pcsample_flags  = 0;
                     25: unsigned int pcsample_enable = 0;
                     26: unsigned int pcsample_nolog  = 1;
                     27: 
                     28: /* Set the default framework boundaries */
                     29: u_long pcsample_beg    = 0;
                     30: u_long pcsample_end    = 0;
                     31: 
                     32: void
                     33: add_pcsamples( pc)
                     34:      register u_long pc;
                     35: {
                     36: 
                     37:        if (pcsample_nolog && pcsample_enable)
                     38:          return;
                     39: 
                     40:        if ((pc < pcsample_beg) || (pc > pcsample_end))
                     41:          return;
                     42: 
                     43:        *pc_bufptr = (u_long)pc;
                     44:        pc_bufptr++;
                     45: 
                     46:        /* We never wrap the buffer */
                     47:        if (pc_bufptr >= pc_buflast)
                     48:          {
                     49:            pcsample_nolog = 1 ;
                     50:          }
                     51: }
                     52: 
                     53: 
                     54: 
                     55: pcsamples_bootstrap()
                     56: {
                     57:        pc_bufsize = npcbufs * sizeof(* pc_buffer);
                     58:        if (kmem_alloc(kernel_map, &pc_buftomem,
                     59:                       (vm_size_t)pc_bufsize) == KERN_SUCCESS) 
                     60:          pc_buffer = (u_long *) pc_buftomem;
                     61:        else 
                     62:          pc_buffer= (u_long *) 0;
                     63: 
                     64:        if (pc_buffer) {
                     65:                pc_bufptr = pc_buffer;
                     66:                pc_buflast = &pc_bufptr[npcbufs];
                     67:                pc_readlast = pc_bufptr;
                     68:                pcsample_enable = 0;
                     69:                pcsample_nolog  = 1;
                     70:                return(0);
                     71:        } else {
                     72:                pc_bufsize=0;
                     73:                return(EINVAL);
                     74:        }
                     75:        
                     76: }
                     77: 
                     78: pcsamples_reinit()
                     79: {
                     80: int x;
                     81: int ret=0;
                     82:        if (pc_bufsize && pc_buffer)
                     83:                kmem_free(kernel_map,pc_buffer,pc_bufsize);
                     84: 
                     85:        ret= pcsamples_bootstrap();
                     86:        return(ret);
                     87: }
                     88: 
                     89: 
                     90: 
                     91: pcsamples_clear()
                     92: {
                     93: int x;
                     94:         /* Clean up the sample buffer, set defaults */ 
                     95:        pcsample_enable = 0;
                     96:        pcsample_nolog  = 1;
                     97:        if(pc_bufsize && pc_buffer)
                     98:          kmem_free(kernel_map,pc_buffer,pc_bufsize);
                     99:        pc_buffer   = (u_long *)0;
                    100:        pc_bufptr   = (u_long *)0;
                    101:        pc_buflast  = (u_long *)0;
                    102:        pc_readlast = (u_long *)0;
                    103:        pc_bufsize  = 0;
                    104:        pcsample_beg= 0;
                    105:        pcsample_end= 0;
                    106: }
                    107: 
                    108: pcsamples_control(name, namelen, where, sizep)
                    109: int *name;
                    110: u_int namelen;
                    111: char *where;
                    112: size_t *sizep;
                    113: {
                    114: int ret=0;
                    115: int size=*sizep;
                    116: int max_entries;
                    117: unsigned int value = name[1];
                    118: pcinfo_t pc_bufinfo;
                    119:        switch(name[0]) {
                    120:                case PCSAMPLE_ENABLE:    /* used to enable or disable */
                    121:                  if (value)
                    122:                    {
                    123:                      /* enable only if buffer is initialized */
                    124:                      if ((pc_bufsize <= 0) || (!pc_buffer))
                    125:                        {
                    126:                          ret=EINVAL;
                    127:                          break;
                    128:                        }
                    129:                    }
                    130:                  pcsample_enable=(value)?1:0;
                    131:                  pcsample_nolog = (value)?0:1;
                    132:                  break;
                    133:                case PCSAMPLE_SETNUMBUF:
                    134:                  /* We allow a maximum buffer size of 25% of memory */
                    135:                        max_entries = (mem_size/4) / sizeof(u_long);
                    136:                        if (value <= max_entries)
                    137:                                npcbufs = value;
                    138:                        else
                    139:                          npcbufs = max_entries;
                    140:                        break;
                    141:                case PCSAMPLE_GETNUMBUF:
                    142:                        if(size < sizeof(pcinfo_t)) {
                    143:                            ret=EINVAL;
                    144:                            break;
                    145:                        }
                    146:                        pc_bufinfo.npcbufs = npcbufs;
                    147:                        pc_bufinfo.bufsize = pc_bufsize;
                    148:                        pc_bufinfo.nolog = pcsample_nolog;
                    149:                        pc_bufinfo.enable = pcsample_enable;
                    150:                        pc_bufinfo.pcsample_beg = pcsample_beg;
                    151:                        pc_bufinfo.pcsample_end = pcsample_end;
                    152:                        if(copyout (&pc_bufinfo, where, sizeof(pc_bufinfo)))
                    153:                          {
                    154:                            ret=EINVAL;
                    155:                          }
                    156:                        break;
                    157:                case PCSAMPLE_SETUP:
                    158:                        ret=pcsamples_reinit();
                    159:                        break;
                    160:                case PCSAMPLE_REMOVE:
                    161:                        pcsamples_clear();
                    162:                        break;
                    163:                case PCSAMPLE_READBUF:
                    164:                        ret = pcsamples_read(where, sizep);
                    165:                        break;
                    166:                case PCSAMPLE_SETREG:
                    167:                        if (size < sizeof(pcinfo_t))
                    168:                          {
                    169:                            ret = EINVAL;
                    170:                            break;
                    171:                          }
                    172:                        if (copyin(where, &pc_bufinfo, sizeof(pcinfo_t)))
                    173:                          {
                    174:                            ret = EINVAL;
                    175:                            break;
                    176:                          }
                    177: 
                    178:                        pcsample_beg = pc_bufinfo.pcsample_beg;
                    179:                        pcsample_end = pc_bufinfo.pcsample_end;
                    180:                        break;
                    181:                default:
                    182:                        ret= EOPNOTSUPP;
                    183:                        break;
                    184:        }
                    185:        return(ret);
                    186: }
                    187: 
                    188: 
                    189: 
                    190: pcsamples_read(u_long *buffer, size_t *number)
                    191: {
                    192: int x,i;
                    193: int ret=0;
                    194: int avail=*number;
                    195: int count=0;
                    196: 
                    197:        count = avail/sizeof(u_long);
                    198:        if (count) {
                    199:                if (pc_bufsize && pc_buffer) {
                    200:                        if (count > npcbufs)
                    201:                            count = npcbufs;
                    202: 
                    203:                        for (i = 0; i < count ; i++ )
                    204:                          {
                    205:                              if (pc_readlast == pc_bufptr)
                    206:                                {  
                    207:                                  /* Nothing left to read */
                    208:                                  /* Reset pointers to begin of buffer */
                    209:                                  pc_readlast = pc_buffer;
                    210:                                  pc_bufptr = pc_buffer;
                    211:                                  if (pcsample_enable)
                    212:                                    {
                    213:                                      /* Always be sure logging is on after a reset */
                    214:                                      pcsample_nolog = 0;
                    215:                                    }
                    216:                                  break;
                    217:                                }
                    218:                              if(copyout(pc_readlast,buffer,sizeof(u_long))) {
                    219:                                  ret=EINVAL;
                    220:                                  break;
                    221:                              }
                    222:                              pc_readlast++;
                    223:                              buffer ++;
                    224:                              if (pc_readlast >= pc_buflast)
                    225:                                {
                    226:                                  /* We've reached the end of the buffer */
                    227:                                  /* Reset pointers to begin of buffer   */
                    228:                                  pc_readlast = pc_buffer;
                    229:                                  pc_bufptr = pc_buffer;
                    230:                                  if (pcsample_enable)
                    231:                                    {
                    232:                                      /* Always be sure logging is on after a reset */
                    233:                                      pcsample_nolog = 0;
                    234:                                    }
                    235:                                  break;                                  
                    236:                                }
                    237:                          }
                    238:                        *number = i;
                    239:                } else ret = EINVAL;
                    240:        } else ret=EINVAL;
                    241:        return (ret);
                    242: }
                    243: 
                    244: 

unix.superglobalmegacorp.com

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