Annotation of kernel/kern/kdebug.c, revision 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.