Annotation of kernel/kern/kdebug.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
                      7:  * Reserved.  This file contains Original Code and/or Modifications of
                      8:  * Original Code as defined in and that are subject to the Apple Public
                      9:  * Source License Version 1.1 (the "License").  You may not use this file
                     10:  * except in compliance with the License.  Please obtain a copy of the
                     11:  * License at http://www.apple.com/publicsource and read it before using
                     12:  * this file.
                     13:  * 
                     14:  * The Original Code and all software distributed under the License are
                     15:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     19:  * License for the specific language governing rights and limitations
                     20:  * under the License.
                     21:  * 
                     22:  * @APPLE_LICENSE_HEADER_END@
                     23:  */
                     24: 
                     25: #import <kern/lock.h>
                     26: #import <bsd/machine/cpu.h>
                     27: #import <vm/vm_kern.h>
                     28: #import <machine/spl.h>
                     29: #import <kern/clock.h>
                     30: #import <kdebug.h>
                     31: #import <kern/kdebug.h>
                     32: #import <kern/kdebug_private.h>
                     33: #import <bsd/sys/errno.h>
                     34: #import <bsd/sys/param.h>              /* for splhigh */
                     35: #import <bsd/sys/proc.h>
                     36: #import <bsd/sys/vm.h>
                     37: #import <bsd/sys/sysctl.h>
                     38: 
                     39: /* kd_buf kd_buffer[kd_bufsize/sizeof(kd_buf)]; */
                     40: kd_buf * kd_bufptr;
                     41: unsigned int kd_buftomem=0;
                     42: kd_buf * kd_buffer=0;
                     43: kd_buf * kd_buflast;
                     44: kd_buf * kd_readlast;
                     45: unsigned int nkdbufs = 8192;
                     46: unsigned int kd_bufsize = 0;
                     47: unsigned int kdebug_flags = 0;
                     48: unsigned int kdebug_enable=0;
                     49: unsigned int kdebug_nolog=1;
                     50: unsigned int kdlog_beg=0;
                     51: unsigned int kdlog_end=0;
                     52: 
                     53: extern tvalspec_t get_timebase(void);
                     54: 
                     55: struct kdebug_args {
                     56:         int code;
                     57:         int arg1;
                     58:         int arg2;
                     59:         int arg3;
                     60:         int arg4;
                     61:         int arg5;
                     62: };
                     63: 
                     64: syscall_kdebug(p, uap, retval)
                     65:         struct proc *p;
                     66:        struct kdebug_args *uap;
                     67:        register_t *retval;
                     68: {
                     69:         if (kdebug_nolog)
                     70:                return(EINVAL);
                     71: 
                     72:         kernel_debug(uap->code, uap->arg1, uap->arg2, uap->arg3, uap->arg4, uap->arg5);
                     73:        return(0);
                     74: }
                     75: 
                     76: 
                     77: void
                     78: kernel_debug(debugid, arg1, arg2, arg3, arg4, arg5)
                     79: unsigned int debugid, arg1, arg2, arg3, arg4, arg5;
                     80: {
                     81:        kd_buf * kd;
                     82: 
                     83:        if (kdebug_nolog ||
                     84:            ((kdebug_flags & KDBG_RANGECHECK) &&
                     85:             ((debugid < kdlog_beg) ||(debugid > kdlog_end))))
                     86:                return;
                     87:        kd = kd_bufptr;
                     88:        kd->debugid= debugid;
                     89:        kd->arg1 = arg1;
                     90:        kd->arg2 = arg2;
                     91:        kd->arg3 = arg3;
                     92:        kd->arg4 = arg4;
                     93:        kd->arg5 = (unsigned int)current_thread();
                     94:        kd->timestamp = get_timebase();
                     95:        kd_bufptr++;
                     96:        if(kdebug_flags & KDBG_NOWRAP) {
                     97:                if (kd_bufptr >= kd_buflast)
                     98:                        kdebug_nolog = 1 ;
                     99:        } else {
                    100:                if ( kd_bufptr >= kd_buflast)
                    101:                {       kd_bufptr =  kd_buffer;
                    102:                        kdebug_flags |= KDBG_WRAPPED;
                    103:                }
                    104:        }
                    105: }
                    106: 
                    107: 
                    108: kdbg_bootstrap()
                    109: {
                    110:        kd_bufsize = nkdbufs * sizeof(kd_buf);
                    111:        if (kmem_alloc(kernel_map, &kd_buftomem ,(vm_size_t)kd_bufsize) == KERN_SUCCESS) 
                    112:        kd_buffer = (kd_buf *) kd_buftomem;
                    113:        else kd_buffer= (kd_buf *) 0;
                    114:        kdebug_flags &= ~KDBG_WRAPPED;
                    115:        if (kd_buffer) {
                    116:                kdebug_flags |= (KDBG_INIT | KDBG_BUFINIT);
                    117:                kd_bufptr = kd_buffer;
                    118:                kd_buflast = &kd_bufptr[nkdbufs];
                    119:                kd_readlast = kd_bufptr;
                    120:                return(0);
                    121:        } else {
                    122:                kd_bufsize=0;
                    123:                kdebug_flags &= ~(KDBG_INIT | KDBG_BUFINIT);
                    124:                return(EINVAL);
                    125:        }
                    126:        
                    127: }
                    128: 
                    129: kdbg_reinit()
                    130: {
                    131: int x;
                    132: int ret=0;
                    133:        x= splhigh();
                    134:        if ((kdebug_flags & KDBG_INIT) && (kdebug_flags & KDBG_BUFINIT) && kd_bufsize && kd_buffer)
                    135:                kmem_free(kernel_map,kd_buffer,kd_bufsize);
                    136:        ret= kdbg_bootstrap();
                    137:        splx(x);
                    138:        return(ret);
                    139: }
                    140: 
                    141: kdbg_clear()
                    142: {
                    143: int x;
                    144:        x=splhigh();
                    145:        kdebug_flags &= ~KDBG_BUFINIT;
                    146:        kmem_free(kernel_map,kd_buffer,kd_bufsize);
                    147:        kd_buffer = (kd_buf *)0;
                    148:        kd_bufsize = 0;
                    149:        kdebug_enable = 0;
                    150:        kdebug_nolog = 1;
                    151:        splx(x);
                    152: }
                    153: 
                    154: kdbg_setreg(kd_regtype * kdr)
                    155: {
                    156:        int i,j, ret=0;
                    157:        unsigned int val_1, val_2, val;
                    158:        switch (kdr->type) {
                    159:        
                    160:        case KDBG_CLASSTYPE :
                    161:                val_1 = (kdr->value1 & 0xff);
                    162:                val_2 = val_1 + 1;
                    163:                kdlog_beg = (val_1<<24);
                    164:                kdlog_end = (val_2<<24);
                    165:                kdebug_flags &= (unsigned int)~KDBG_CKTYPES;
                    166:                kdebug_flags |= (KDBG_RANGECHECK | KDBG_CLASSTYPE);
                    167:                break;
                    168:        case KDBG_SUBCLSTYPE :
                    169:                val_1 = (kdr->value1 & 0xff);
                    170:                val_2 = (kdr->value2 & 0xff);
                    171:                val = val_2 + 1;
                    172:                kdlog_beg = ((val_1<<24) | (val_2 << 16));
                    173:                kdlog_end = ((val_1<<24) | (val << 16));
                    174:                kdebug_flags &= (unsigned int)~KDBG_CKTYPES;
                    175:                kdebug_flags |= (KDBG_RANGECHECK | KDBG_SUBCLSTYPE);
                    176:                break;
                    177:        case KDBG_RANGETYPE :
                    178:                kdlog_beg = (kdr->value1);
                    179:                kdlog_end = (kdr->value2);
                    180:                kdebug_flags &= (unsigned int)~KDBG_CKTYPES;
                    181:                kdebug_flags |= (KDBG_RANGECHECK | KDBG_RANGETYPE);
                    182:                break;
                    183:        case KDBG_TYPENONE :
                    184:                kdebug_flags &= (unsigned int)~KDBG_CKTYPES;
                    185:                kdlog_beg = 0;
                    186:                kdlog_end = 0;
                    187:                break;
                    188:        default :
                    189:                ret = EINVAL;
                    190:                break;
                    191:        }
                    192:        return(ret);
                    193: }
                    194: 
                    195: kdbg_getreg(kd_regtype * kdr)
                    196: {
                    197:        int i,j, ret=0;
                    198:        unsigned int val_1, val_2, val;
                    199: #if 0  
                    200:        switch (kdr->type) {
                    201:        case KDBG_CLASSTYPE :
                    202:                val_1 = (kdr->value1 & 0xff);
                    203:                val_2 = val_1 + 1;
                    204:                kdlog_beg = (val_1<<24);
                    205:                kdlog_end = (val_2<<24);
                    206:                kdebug_flags &= (unsigned int)~KDBG_CKTYPES;
                    207:                kdebug_flags |= (KDBG_RANGECHECK | KDBG_CLASSTYPE);
                    208:                break;
                    209:        case KDBG_SUBCLSTYPE :
                    210:                val_1 = (kdr->value1 & 0xff);
                    211:                val_2 = (kdr->value2 & 0xff);
                    212:                val = val_2 + 1;
                    213:                kdlog_beg = ((val_1<<24) | (val_2 << 16));
                    214:                kdlog_end = ((val_1<<24) | (val << 16));
                    215:                kdebug_flags &= (unsigned int)~KDBG_CKTYPES;
                    216:                kdebug_flags |= (KDBG_RANGECHECK | KDBG_SUBCLSTYPE);
                    217:                break;
                    218:        case KDBG_RANGETYPE :
                    219:                kdlog_beg = (kdr->value1);
                    220:                kdlog_end = (kdr->value2);
                    221:                kdebug_flags &= (unsigned int)~KDBG_CKTYPES;
                    222:                kdebug_flags |= (KDBG_RANGECHECK | KDBG_RANGETYPE);
                    223:                break;
                    224:        case KDBG_TYPENONE :
                    225:                kdebug_flags &= (unsigned int)~KDBG_CKTYPES;
                    226:                kdlog_beg = 0;
                    227:                kdlog_end = 0;
                    228:                break;
                    229:        default :
                    230:                ret = EINVAL;
                    231:                break;
                    232:        }
                    233: #endif /* 0 */
                    234:        return(EINVAL);
                    235: }
                    236: 
                    237: kdbg_control(name, namelen, where, sizep)
                    238: int *name;
                    239: u_int namelen;
                    240: char *where;
                    241: size_t *sizep;
                    242: {
                    243: int ret=0;
                    244: int size=*sizep;
                    245: unsigned int value = name[1];
                    246: kd_regtype kd_Reg;
                    247: int kd_val[3];
                    248: 
                    249:        switch(name[0]) {
                    250:                case KERN_KDEFLAGS:
                    251:                        value &= KDBG_USERFLAGS;
                    252:                        kdebug_flags |= value;
                    253:                        break;
                    254:                case KERN_KDDFLAGS:
                    255:                        value &= KDBG_USERFLAGS;
                    256:                        kdebug_flags &= ~value;
                    257:                        break;
                    258:                case KERN_KDENABLE:
                    259:                        kdebug_enable=(value)?1:0;
                    260:                        kdebug_nolog = (value)?0:1;;
                    261:                        break;
                    262:                case KERN_KDSETBUF:
                    263:                        if (value <= (KDBG_MAXBUFSIZE))
                    264:                                nkdbufs = value;
                    265:                        else ret= EINVAL;
                    266:                        break;
                    267:                case KERN_KDGETBUF:
                    268:                  if(size < sizeof(kd_val)) {
                    269:                    ret=EINVAL;
                    270:                    break;
                    271:                  }
                    272:                  kd_val[0] = nkdbufs;
                    273:                  kd_val[1] = kdebug_nolog;
                    274:                  kd_val[2] = kdebug_flags;
                    275:                  if(copyout (&kd_val, where, sizeof(kd_val))) {
                    276:                    ret=EINVAL;
                    277:                  }
                    278:                  break;
                    279:                case KERN_KDSETUP:
                    280:                        ret=kdbg_reinit();
                    281:                        break;
                    282:                case KERN_KDREMOVE:
                    283:                        kdbg_clear();
                    284:                        break;
                    285:                case KERN_KDSETREG:
                    286:                        if(size < sizeof(kd_regtype)) {
                    287:                                ret=EINVAL;
                    288:                                break;
                    289:                        }
                    290:                        if (copyin(where, &kd_Reg, sizeof(kd_regtype))) {
                    291:                                ret= EINVAL;
                    292:                                break;
                    293:                        }
                    294:                        ret = kdbg_setreg(&kd_Reg);
                    295:                        break;
                    296:                case KERN_KDGETREG:
                    297:                        if(size < sizeof(kd_regtype)) {
                    298:                                ret = EINVAL;
                    299:                                break;
                    300:                        }
                    301:                        ret = kdbg_getreg(&kd_Reg);
                    302:                        if (copyout(&kd_Reg, where, sizeof(kd_regtype))){
                    303:                                ret=EINVAL;
                    304:                        }
                    305:                        break;
                    306:                case KERN_KDREADTR:
                    307:                        ret = kdbg_read(where, sizep);
                    308:                        break;
                    309:                default:
                    310:                        ret= EINVAL;
                    311:        }
                    312:        return(ret);
                    313: }
                    314: 
                    315: 
                    316: kdbg_read(kd_buf * buffer, size_t *number)
                    317: {
                    318: int x,i;
                    319: kd_buf *start; 
                    320: int ret=0;
                    321: int avail=*number;
                    322: int count=0;
                    323: 
                    324:        count = avail/sizeof(kd_buf);
                    325:        if (count) {
                    326:                if ((kdebug_flags & KDBG_BUFINIT) && kd_bufsize && kd_buffer) {
                    327:                        if (count > nkdbufs) count = nkdbufs;
                    328:                        x= splhigh();
                    329:                        if (kdebug_flags & KDBG_WRAPPED)
                    330:                        {       kd_readlast = kd_bufptr+1;
                    331:                                if (kd_readlast > kd_buflast)
                    332:                                        kd_readlast = kd_buffer;
                    333:                                kdebug_flags &= ~KDBG_WRAPPED;
                    334:                        }
                    335:                        for (i = 0 ; i < count ; i++ ) {
                    336:                                if (kd_readlast == kd_bufptr) break;
                    337:                                if(copyout(kd_readlast,buffer,sizeof(kd_buf))) {
                    338:                                        ret=EINVAL;
                    339:                                        break;
                    340:                                }
                    341:                                kd_readlast++;
                    342:                                buffer ++;
                    343:                                if (kd_readlast >= kd_buflast)
                    344:                                        kd_readlast = kd_buffer;
                    345:                        }
                    346:                        splx(x);
                    347:                        *number = i;
                    348:                } else ret = EINVAL;
                    349:        } else ret=EINVAL;
                    350: 
                    351:        return (ret);
                    352: }

unix.superglobalmegacorp.com

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