Annotation of driverkit/libDriver/Kernel/generalFuncs.m, 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: /*     Copyright (c) 1991 NeXT Computer, Inc.  All rights reserved. 
        !            25:  *
        !            26:  * libIO.m - IO Library, kernel version.
        !            27:  *
        !            28:  * HISTORY
        !            29:  * 17-Apr-91    Doug Mitchell at NeXT
        !            30:  *      Created.
        !            31:  *
        !            32:  * This file contains most of the kernel libIO implementation. Some portions
        !            33:  * deal with kernel task_t and thread_t structs directly; that code is
        !            34:  * in libIO_Private.m.
        !            35:  */
        !            36: 
        !            37: #import <bsd/sys/types.h>
        !            38: #import <objc/objc.h> 
        !            39: #import <driverkit/return.h>
        !            40: #import <driverkit/memcpy.h>
        !            41: #import <driverkit/generalFuncs.h> 
        !            42: #import <mach/mach_user_internal.h>
        !            43: #import <mach/mach_interface.h>
        !            44: #import <stdarg.h>
        !            45: #import <machkit/NXLock.h>
        !            46: #import <machine/mach_param.h>
        !            47: #import <bsd/sys/syslog.h>
        !            48: #import <bsd/sys/callout.h>
        !            49: #import <bsd/dev/ldd.h>
        !            50: #import <kernserv/ns_timer.h>
        !            51: #import <kern/clock.h>
        !            52: 
        !            53: /*
        !            54:  * Misc. kernel prototypes.
        !            55:  */
        !            56: 
        !            57: extern port_name_t IOTask;                     // IOTask's task port
        !            58: 
        !            59: /*
        !            60:  * Take this out when we have a kernel debugger that works.
        !            61:  */
        !            62: extern int libIO_dbg;
        !            63: #define cdprint(x) {           \
        !            64:        if(libIO_dbg) {         \
        !            65:                printf x;       \
        !            66:        }                       \
        !            67: }
        !            68: 
        !            69: /*
        !            70:  * Kernel level libIO implementation.
        !            71:  */
        !            72:  
        !            73: void *IOMalloc(int size)
        !            74: {
        !            75:        return(kalloc(size));
        !            76: }
        !            77: 
        !            78: void IOFree(void *p, int size)
        !            79: {
        !            80:        kfree(p, size);
        !            81: }
        !            82: 
        !            83: void IOCopyMemory(void *from, void *to, unsigned int numBytes, 
        !            84:        unsigned int bytesPerTransfer)
        !            85: {
        !            86:        _IOCopyMemory(from, to, numBytes, bytesPerTransfer);    
        !            87: }
        !            88:  
        !            89: 
        !            90: void IOSleep(unsigned milliseconds)
        !            91: {
        !            92:        ns_sleep((ns_time_t)(milliseconds) * 1000000LL);
        !            93: }
        !            94: 
        !            95: /*
        !            96:  * Spin for indicated number of microseconds.
        !            97:  */
        !            98: void IODelay(unsigned microseconds)
        !            99: {
        !           100:        DELAY(microseconds);
        !           101: }
        !           102: 
        !           103: /*
        !           104:  * Call function fcn with argument arg in specified number of seconds.
        !           105:  */
        !           106: void IOScheduleFunc(IOThreadFunc fcn, void *arg, int seconds)
        !           107: {
        !           108:        ns_time_t ns_time = (ns_time_t) seconds * 1000000000;
        !           109:        
        !           110:        ns_timeout((func)fcn, arg, ns_time, CALLOUT_PRI_THREAD);
        !           111: }
        !           112: 
        !           113: /*
        !           114:  * Cancel callout requested in IOScheduleFunc().
        !           115:  */
        !           116: void IOUnscheduleFunc(IOThreadFunc fcn, void *arg)
        !           117: {
        !           118:        ns_untimeout((func)fcn, arg);
        !           119: }
        !           120: 
        !           121: /*
        !           122:  * Obtain current time in nanoseconds.
        !           123:  */
        !           124: void IOGetTimestamp(ns_time_t *nsp)
        !           125: {
        !           126:        tvalspec_t              now = clock_get_counter(System);
        !           127: 
        !           128:        *nsp = ((ns_time_t)now.tv_sec * NSEC_PER_SEC) + now.tv_nsec;
        !           129: }
        !           130: 
        !           131: void IOLog(const char *format, ...)
        !           132: {
        !           133:         va_list ap;
        !           134:         
        !           135:         va_start(ap, format);
        !           136:         vlog(LOG_INFO, format, ap);
        !           137:         va_end(ap);
        !           138: }
        !           139: 
        !           140: /*
        !           141:  * Panic.
        !           142:  */
        !           143: void IOPanic(const char *reason)
        !           144: {
        !           145:        panic(reason);
        !           146: }
        !           147: 
        !           148: 
        !           149: /*
        !           150:  * Convert a integer constant (typically a #define or enum) to a string.
        !           151:  */
        !           152: static char noValue[80];
        !           153: 
        !           154: const char *IOFindNameForValue(int value, const IONamedValue *regValueArray)
        !           155: {
        !           156:        for( ; regValueArray->name; regValueArray++) {
        !           157:                if(regValueArray->value == value)
        !           158:                        return(regValueArray->name);
        !           159:        }
        !           160:        sprintf(noValue, "%d(d) (UNDEFINED)", value);
        !           161:        return((const char *)noValue);
        !           162: }
        !           163: 
        !           164: IOReturn IOFindValueForName(const char *string, 
        !           165:        const IONamedValue *regValueArray,
        !           166:        int *value)
        !           167: {
        !           168:        for( ; regValueArray->name; regValueArray++) {
        !           169:                if(!strcmp(regValueArray->name, string)) {
        !           170:                        *value = regValueArray->value;
        !           171:                        return IO_R_SUCCESS;
        !           172:                }
        !           173:        }
        !           174:        return IO_R_INVALID_ARG;
        !           175: }
        !           176: 
        !           177: IOAlignment IOSizeToAlignment(unsigned int size)
        !           178: {
        !           179:     register int shift;
        !           180:     const intsize = sizeof(unsigned int) * 8;
        !           181:     
        !           182:     for (shift = 1; shift < intsize; shift++) {
        !           183:        if (size & 0x80000000)
        !           184:            return (IOAlignment)(intsize - shift);
        !           185:        size <<= 1;
        !           186:     }
        !           187:     return 0;
        !           188: }
        !           189: 
        !           190: unsigned int IOAlignmentToSize(IOAlignment align)
        !           191: {
        !           192:     unsigned int size;
        !           193:     
        !           194:     for (size = 1; align; align--) {
        !           195:        size <<= 1;
        !           196:     }
        !           197:     return size;
        !           198: }
        !           199: 
        !           200: /*
        !           201:  * Temporary test of IOTask context.
        !           202:  */
        !           203: #ifdef DEBUG
        !           204: void iotaskTest()
        !           205: {
        !           206:        kern_return_t krtn;
        !           207:        port_t port1;
        !           208:        port_t port2;
        !           209:        msg_header_t *msg1, *msg2;
        !           210:        
        !           211:        /*
        !           212:         * Allocate 2 ports.
        !           213:         */
        !           214:        krtn = port_allocate(task_self(), &port1);
        !           215:        if(krtn) {
        !           216:                printf("iotaskTest: port_allocate() returned %d\n", krtn);
        !           217:                return; 
        !           218:        }
        !           219:        else {
        !           220:                cdprint(("...iotaskTest port1 %d\n", port1));
        !           221:        }
        !           222:        krtn = port_allocate(task_self(), &port2);
        !           223:        if(krtn) {
        !           224:                printf("iotaskTest: port_allocate() returned %d\n", krtn);
        !           225:                return; 
        !           226:        }
        !           227:        else {
        !           228:                cdprint(("...iotaskTest port2 %d\n", port2));
        !           229:        }
        !           230:        
        !           231:        /*
        !           232:         * Send a dummy message from one port to another.
        !           233:         */
        !           234:        msg1 = IOMalloc(sizeof(*msg1));
        !           235:        msg1->msg_simple = 1;
        !           236:        msg1->msg_size = sizeof(*msg1);
        !           237:        msg1->msg_type = MSG_TYPE_NORMAL;
        !           238:        msg1->msg_local_port = port1;
        !           239:        msg1->msg_remote_port = port2;
        !           240:        msg1->msg_id = 123;
        !           241:        krtn = msg_send(msg1, SEND_TIMEOUT, 1);
        !           242:        if(krtn) {
        !           243:                printf("iotaskTest: msg_send() returned %d\n", krtn);
        !           244:                return; 
        !           245:        }
        !           246:        
        !           247:        /*
        !           248:         * Receive the message.
        !           249:         */
        !           250:        msg2 = IOMalloc(sizeof(*msg2));
        !           251:        msg2->msg_size = sizeof(*msg2);
        !           252:        msg2->msg_local_port = port2;
        !           253:        krtn = msg_receive(msg2, RCV_TIMEOUT, 0);
        !           254:        if(krtn) {
        !           255:                printf("iotaskTest: msg_receive() returned %d\n", krtn);
        !           256:                return; 
        !           257:        }
        !           258:        cdprint(("iotaskTest: SUCCESS\n"));
        !           259:        port_deallocate(task_self(), port1);
        !           260:        port_deallocate(task_self(), port2);
        !           261:        IOFree(msg1, sizeof(*msg1));
        !           262:        IOFree(msg2, sizeof(*msg2));
        !           263:        IOExitThread();
        !           264: }
        !           265: #endif DEBUG
        !           266: /* end of libIO.m */

unix.superglobalmegacorp.com

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