Annotation of driverkit/libDriver/User/debugging.m, 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: /*     Copyright (c) 1991 NeXT Computer, Inc.  All rights reserved. 
                     25:  *
                     26:  * debugging.m - driverkit debugging module.
                     27:  *
                     28:  * HISTORY
                     29:  * 22-Feb-91    Doug Mitchell at NeXT
                     30:  *      Created. 
                     31:  */
                     32: 
                     33: #import <bsd/sys/types.h>
                     34: #import <driverkit/debugging.h>
                     35: #import <driverkit/ddmPrivate.h>
                     36: #import <driverkit/generalFuncs.h>
                     37: #import <machkit/NXLock.h>
                     38: #import <driverkit/return.h>
                     39: #ifdef KERNEL
                     40: #import <kernserv/prototypes.h>
                     41: #import <kernserv/machine/cpu_number.h>
                     42: #else  KERNEL
                     43: #import <bsd/libc.h>
                     44: #endif KERNEL
                     45: 
                     46: #if    KERNEL && __nrw__
                     47: #define _MON_TYPES_BOOLEAN_
                     48: #define _MON_TYPES_CPUTYPES_
                     49: #define _MON_TYPES_SIZE_
                     50: #define        _MON_BIT_MACROS_
                     51: #import <mon/mon_global.h>
                     52: #endif KERNEL && __nrw__
                     53: 
                     54: #if    TIMESTAMP_HALF_USEC
                     55: static unsigned xprTimeStamp();
                     56: #endif TIMESTAMP_HALF_USEC
                     57: 
                     58: /*
                     59:  * xprbuf_t's are kept in a circular buffer, uxprGlobal.xprArray. New 
                     60:  * entries are added when the client calls xprAdd. The buffer is examined 
                     61:  * from an external task which communicates with xprServerThread via 
                     62:  * simple Mach messages.
                     63:  */
                     64:  
                     65: /*
                     66:  * Globals.
                     67:  */
                     68: unsigned       IODDMMasks[IO_NUM_DDM_MASKS];   
                     69:                                        /* an array of task-specific bits. 
                     70:                                         * Typically tweaked at run time. */
                     71: uxprGlobal_t   uxprGlobal;
                     72: id             xprLock;                /* NXSpinLock. protects xprLocked */
                     73: int            xprLocked = 0;          /* Simple flag used to prevent adding 
                     74:                                         * xpr entries while server is 
                     75:                                         * accessing xprArray. Only written by
                     76:                                         * server. */
                     77: 
                     78: static xprbuf_t *xprEnd;               /* Pointer to entry at end of 
                     79:                                         * xprArray */
                     80: static int     xprInitialized;
                     81: 
                     82: /*
                     83:  * Initialize. Client must call this once, before using any services.
                     84:  */
                     85: #ifdef KERNEL
                     86: void IOInitDDM(int numBufs)
                     87: #else  KERNEL
                     88: void IOInitDDM(int numBufs, char *serverPortName)
                     89: #endif KERNEL
                     90: {
                     91:        if(xprInitialized) {
                     92:                return;
                     93:        }
                     94:        uxprGlobal.xprArray = IOMalloc(sizeof(xprbuf_t) * numBufs);
                     95:        uxprGlobal.numXprBufs = numBufs;
                     96:        xprEnd = uxprGlobal.xprArray + uxprGlobal.numXprBufs - 1;
                     97:        IOClearDDM();
                     98:        xprLock = [NXSpinLock new];
                     99:        
                    100: #ifndef        KERNEL
                    101:        /*
                    102:         * Start up the server thread for user version. Kernel server 
                    103:         * is implemented via kernserv.
                    104:         */
                    105:        IOForkThread((IOThreadFunc)xprServerThread, serverPortName);
                    106: #else  KERNEL
                    107: #if    __nrw__
                    108:        mon_global->machdep_global.uxpr_global = &uxprGlobal;
                    109: #endif __nrw__
                    110: #endif KERNEL
                    111:        xprInitialized = 1;
                    112: }
                    113: 
                    114: /*
                    115:  * add one entry to xprArray.
                    116:  */
                    117: void IOAddDDMEntry(char *str, int arg1, int arg2, 
                    118:                                    int arg3, int arg4, int arg5)
                    119: {
                    120:        xprbuf_t *last;
                    121:        
                    122:        if(uxprGlobal.xprArray == NULL)
                    123:                return;                         /* not initialized */
                    124:        [xprLock lock];
                    125:        if(xprLocked) {
                    126:                [xprLock unlock];
                    127:                return;
                    128:        }
                    129:        if(++uxprGlobal.xprLast > xprEnd)       /* wrap around */
                    130:                uxprGlobal.xprLast = uxprGlobal.xprArray;       
                    131:        last = uxprGlobal.xprLast;
                    132:        last->msg = str;
                    133:        last->arg1 = arg1;
                    134:        last->arg2 = arg2;
                    135:        last->arg3 = arg3;
                    136:        last->arg4 = arg4;
                    137:        last->arg5 = arg5;
                    138:        
                    139:        /*
                    140:         * As of 17-Aug-92, timestamp is 32 bits of 
                    141:         * half-microseconds.
                    142:         */
                    143: #if    TIMESTAMP_HALF_USEC
                    144:        last->timestamp = (unsigned long long)xprTimeStamp();
                    145: #else  TIMESTAMP_HALF_USEC
                    146:        IOGetTimestamp(&last->timestamp);
                    147: #endif TIMESTAMP_HALF_USEC
                    148: 
                    149: #if    KERNEL && __nrw__
                    150:        last->cpu_num = cpu_number();
                    151: #else  KERNEL && __nrw__
                    152:        last->cpu_num = 0;
                    153: #endif KERNEL && __nrw__
                    154:        if(uxprGlobal.numValidEntries < uxprGlobal.numXprBufs)
                    155:                uxprGlobal.numValidEntries++;
                    156:        [xprLock unlock];
                    157: }
                    158: 
                    159: /*
                    160:  * Clear the array.
                    161:  */
                    162: void IOClearDDM()
                    163: {
                    164:        uxprGlobal.xprLast = xprEnd;            /* last entry */
                    165:        uxprGlobal.numValidEntries = 0;
                    166: }
                    167: 
                    168: /*
                    169:  * Set bit mask of IODDMMasks[index]. Typically used by both client and 
                    170:  * the server thread.
                    171:  */
                    172: void IOSetDDMMask(int index, unsigned int bitmask)
                    173: {
                    174:        if(index > IO_NUM_DDM_MASKS) {
                    175:                IOLog("xprSetBitmask: illegal index (%d)\n", index);
                    176:                return;
                    177:        }
                    178:        IODDMMasks[index] = bitmask;
                    179: }
                    180: 
                    181: unsigned IOGetDDMMask(int index)
                    182: {
                    183:        if(index > IO_NUM_DDM_MASKS) {
                    184:                IOLog("xprGetBitmask: illegal index (%d)\n", index);
                    185:                return(0);
                    186:        }
                    187:        return IODDMMasks[index];
                    188: }
                    189: 
                    190: /*
                    191:  * Obtain one sprintf'd entry from the xprArray. index indicates which entry 
                    192:  * to return, counting backwards from the last (latest) entry. Returns 
                    193:  * nonzero if specified entry does not exist.
                    194:  */
                    195: int IOGetDDMEntry(
                    196:        int             index,          // desired entry
                    197:        int             outStringSize,  // memory available in outString
                    198:        char            *outString,     // result goes here
                    199:        unsigned long long *timestamp,  // returned
                    200:        int             *cpu_num)       // returned
                    201: {
                    202:        xprbuf_t *xprbuf;
                    203:        char xprstring[300];
                    204: 
                    205:        if(index >= uxprGlobal.numValidEntries) {
                    206:                /*
                    207:                 * Ran off the end of the buffer.
                    208:                 */
                    209:                return -1;
                    210:        }
                    211:        xprbuf = uxprGlobal.xprLast - index;
                    212:        if(xprbuf < uxprGlobal.xprArray)
                    213:                xprbuf += uxprGlobal.numXprBufs;                
                    214:        
                    215:        sprintf(xprstring, xprbuf->msg, xprbuf->arg1, 
                    216:                xprbuf->arg2, 
                    217:                xprbuf->arg3, 
                    218:                xprbuf->arg4, 
                    219:                xprbuf->arg5); 
                    220:        if(strlen(xprstring) > outStringSize)
                    221:                xprstring[outStringSize - 1] = '\0';
                    222:        strcpy(outString, xprstring);
                    223:        *timestamp = xprbuf->timestamp;
                    224:        *cpu_num   = xprbuf->cpu_num;
                    225:        return 0;
                    226: }
                    227: 
                    228: /*
                    229:  * return a malloc'd copy of instring. To be used when a string to 
                    230:  * be XPR'd is volatile; the memory malloc'd here is never
                    231:  * freed!
                    232:  */
                    233: const char *IOCopyString(const char *instring)
                    234: {
                    235:        char *outstring = IOMalloc(strlen((char *)instring));
                    236:        
                    237:        strcpy(outstring, instring);
                    238:        return((const char *)outstring);
                    239: }
                    240: 
                    241: #if    TIMESTAMP_HALF_USEC
                    242: /*
                    243:  * Obtain timestamp - 32 bits of half-microseconds.
                    244:  */
                    245: static unsigned xprTimeStamp()
                    246: {
                    247:        struct tsval ts;
                    248:        
                    249:        kern_timestamp(&ts);
                    250:        return (ts.low_val * 2);
                    251: }
                    252: 
                    253: #endif TIMESTAMP_HALF_USEC

unix.superglobalmegacorp.com

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