Annotation of XNU/iokit/Families/IONDRVSupport/IONDRV.cpp, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
        !             3:  *
        !             4:  * @APPLE_LICENSE_HEADER_START@
        !             5:  * 
        !             6:  * The contents of this file constitute Original Code as defined in and
        !             7:  * are subject to the Apple Public Source License Version 1.1 (the
        !             8:  * "License").  You may not use this file except in compliance with the
        !             9:  * License.  Please obtain a copy of the License at
        !            10:  * http://www.apple.com/publicsource and read it before using this file.
        !            11:  * 
        !            12:  * This Original Code and all software distributed under the License are
        !            13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
        !            14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
        !            15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
        !            16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
        !            17:  * License for the specific language governing rights and limitations
        !            18:  * under the License.
        !            19:  * 
        !            20:  * @APPLE_LICENSE_HEADER_END@
        !            21:  */
        !            22: /*
        !            23:  * Copyright (c) 1997 Apple Computer, Inc.
        !            24:  *
        !            25:  *
        !            26:  * HISTORY
        !            27:  *
        !            28:  * sdouglas  22 Oct 97 - first checked in.
        !            29:  * sdouglas  21 Jul 98 - start IOKit
        !            30:  * sdouglas  14 Dec 98 - start cpp.
        !            31:  */
        !            32: 
        !            33: 
        !            34: 
        !            35: #include <IOKit/IOLib.h>
        !            36: #include <libkern/c++/OSContainers.h>
        !            37: 
        !            38: extern "C" {
        !            39: #include <pexpert/pexpert.h>
        !            40: };
        !            41: 
        !            42: #include "IONDRV.h"
        !            43: #include "IOPEFLoader.h"
        !            44: 
        !            45: #define LOG            if(1) kprintf
        !            46: 
        !            47: #define USE_TREE_NDRVS 1
        !            48: #define USE_ROM_NDRVS  1
        !            49: 
        !            50: 
        !            51: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        !            52: 
        !            53: #define super OSObject
        !            54: 
        !            55: OSDefineMetaClassAndStructors(IONDRV, OSObject)
        !            56: 
        !            57: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        !            58: 
        !            59: IONDRV * IONDRV::instantiate( IOLogicalAddress container,
        !            60:                                 IOByteCount containerSize )
        !            61: {
        !            62:     OSStatus            err = 1;
        !            63:     IONDRV *           inst;
        !            64: 
        !            65:     inst = new IONDRV;
        !            66: 
        !            67:     if( inst) do {
        !            68:        if( false == inst->init())
        !            69:            continue;
        !            70: 
        !            71:         err = PCodeOpen( (void *)container, containerSize, &inst->pcInst );
        !            72:         if( err)
        !            73:            continue;
        !            74:         err = PCodeInstantiate( inst->pcInst );
        !            75:         if( err)
        !            76:            continue;
        !            77: 
        !            78:        inst->getSymbol( "DoDriverIO",
        !            79:                                (IOLogicalAddress *) &inst->fDoDriverIO );
        !            80:        if( kIOReturnSuccess == inst->getSymbol( "TheDriverDescription", 
        !            81:                                (IOLogicalAddress *) &inst->theDriverDesc )) {
        !            82: 
        !            83:             char *     name;
        !            84:             int                plen;
        !            85: 
        !            86:             name = (char *) inst->theDriverDesc->driverOSRuntimeInfo.driverName;
        !            87:             plen = name[ 0 ];
        !            88:             strncpy( name, name + 1, plen);
        !            89:            name[ plen ] = 0;
        !            90: 
        !            91:            kprintf("ndrv version %08x\n",
        !            92:                        inst->theDriverDesc-> driverType.version);
        !            93:        }
        !            94: 
        !            95:     } while( false);
        !            96: 
        !            97:     if( inst && err) {
        !            98:        inst->release();
        !            99:        inst = 0;
        !           100:     }
        !           101: 
        !           102:     return( inst );
        !           103: }
        !           104: 
        !           105: void IONDRV::free( void )
        !           106: {
        !           107:     super::free();
        !           108: }
        !           109: 
        !           110: IOReturn IONDRV::getSymbol( const char * symbolName,
        !           111:                                IOLogicalAddress * address )
        !           112: {
        !           113:     OSStatus            err;
        !           114: 
        !           115:     err = PCodeFindExport( pcInst, symbolName,
        !           116:                                (LogicalAddress *)address, NULL );
        !           117:     if( err)
        !           118:        *address = 0;
        !           119: 
        !           120:     return( err);
        !           121: }
        !           122: 
        !           123: #if 0
        !           124:             if(        (err = NDRVGetShimClass( ioDevice, instance, 0, classNames ))
        !           125:             ) continue;
        !           126:             err = [propTable createProperty:"AAPL,dk_Driver Name" flags:0
        !           127:                         value:classNames length:strlen( classNames) ];
        !           128:             err = [propTable createProperty:"AAPL,dk_Server Name" flags:0
        !           129:                         value:classNames length:strlen( classNames) ];
        !           130: 
        !           131: OSStatus    NDRVGetShimClass( id ioDevice, NDRVInstance instance, UInt32 serviceIndex, char * className )
        !           132: {
        !           133:     NDRVInstanceVars  *        ndrvInst = (NDRVInstanceVars *) instance;
        !           134:     OSStatus                   err;
        !           135:     static const char *                driverDescProperty = "TheDriverDescription";
        !           136:     static const char *                frameBufferShim = "IONDRVFramebuffer";
        !           137:     DriverDescription *        desc;
        !           138:     UInt32                     serviceType;
        !           139: 
        !           140:     className[ 0 ] = 0;
        !           141:     do {
        !           142:        err = PCodeFindExport( ndrvInst->pcInst, driverDescProperty, (IOLogicalAddress *)&desc, NULL );
        !           143:         if( err) continue;
        !           144: 
        !           145:        if( desc->driverDescSignature != kTheDescriptionSignature) {
        !           146:            err = -1;
        !           147:            continue;
        !           148:        }
        !           149:        if( serviceIndex >= desc->driverServices.nServices) {
        !           150:            err = -1;
        !           151:            continue;
        !           152:        }
        !           153: 
        !           154:        serviceType = desc->driverServices.service[ serviceIndex ].serviceType;
        !           155:        switch( desc->driverServices.service[ serviceIndex ].serviceCategory) {
        !           156: 
        !           157:            case kServiceCategoryNdrvDriver:
        !           158:                if( serviceType == kNdrvTypeIsVideo) {
        !           159:                     strcpy( className, frameBufferShim);
        !           160:                    break;
        !           161:                }
        !           162:            default:
        !           163:                err = -1;
        !           164:        }
        !           165:     } while( false);
        !           166: 
        !           167:     return( err);
        !           168: }
        !           169: #endif
        !           170: 
        !           171: 
        !           172: 
        !           173: IOReturn IONDRV::doDriverIO( UInt32 commandID, void * contents,
        !           174:                                UInt32 commandCode, UInt32 commandKind )
        !           175: {
        !           176:     OSStatus                   err;
        !           177: 
        !           178:     if( 0 == fDoDriverIO)
        !           179:        return( kIOReturnUnsupported );
        !           180: 
        !           181:     err = CallTVector( /*AddressSpaceID*/ 0, (void *)commandID, contents,
        !           182:                (void *)commandCode, (void *)commandKind, /*p6*/ 0,
        !           183:                fDoDriverIO );
        !           184: 
        !           185: #if 0
        !           186:     if( err) {
        !           187:        UInt32 i;
        !           188:        static const char * commands[] = 
        !           189:                { "kOpenCommand", "kCloseCommand",
        !           190:                "kReadCommand", "kWriteCommand",
        !           191:                "kControlCommand", "kStatusCommand", "kKillIOCommand",
        !           192:                "kInitializeCommand", "kFinalizeCommand",
        !           193:                "kReplaceCommand", "kSupersededCommand" };
        !           194: 
        !           195:        LOG("Driver failed (%d) on %s : ", err, commands[ commandCode ] );
        !           196: 
        !           197:        switch( commandCode) {
        !           198:            case kControlCommand:
        !           199:            case kStatusCommand:
        !           200:                LOG("%d : ", ((UInt16 *)contents)[ 0x1a / 2 ]);
        !           201:                contents = ((void **)contents)[ 0x1c / 4 ];
        !           202:                for( i = 0; i<5; i++ )
        !           203:                    LOG("%08x, ", ((UInt32 *)contents)[i] );
        !           204:                break;
        !           205:        }
        !           206:        LOG("\n");
        !           207:     }
        !           208: #endif
        !           209: 
        !           210:     return( err);
        !           211: }
        !           212: 
        !           213: 
        !           214: IONDRV * IONDRV::fromRegistryEntry( IORegistryEntry * regEntry )
        !           215: {
        !           216:     IOLogicalAddress   pef = 0;
        !           217:     IOByteCount                propSize = 0;
        !           218:     OSData *           prop;
        !           219:     IONDRV *           inst;
        !           220: 
        !           221:     inst = (IONDRV *) regEntry->getProperty("AAPL,ndrvInst");
        !           222:     if( inst) {
        !           223:        inst->retain();
        !           224:        return( inst );
        !           225:     }
        !           226: 
        !           227:     // -- only enable the boot display unless mmon flag is set
        !           228: #if 0
        !           229:     int        num;
        !           230:     prop = (OSData *) regEntry->getProperty( "AAPL,boot-display" );
        !           231:     if( (0 == prop) && (!PE_parse_boot_arg("mmon", &num)))
        !           232:        return( 0 );
        !           233: #endif
        !           234:     // --
        !           235: 
        !           236:     prop = (OSData *) regEntry->getProperty( "driver,AAPL,MacOS,PowerPC" );
        !           237:     if( USE_TREE_NDRVS && prop) {
        !           238:         pef = (IOLogicalAddress) prop->getBytesNoCopy();
        !           239:        propSize = prop->getLength();
        !           240:     }
        !           241: 
        !           242:     // God awful hack:
        !           243:     // Some onboard devices don't have the ndrv in the tree. The booter
        !           244:     // can load & match PEF's but only from disk, not network boots.
        !           245: 
        !           246: #if USE_ROM_NDRVS
        !           247:     if( !pef && (0 == strcmp( regEntry->getName(), "ATY,mach64_3DU")) ) {
        !           248: 
        !           249:         int * patch;
        !           250: 
        !           251:         patch = (int *) 0xffe88140;
        !           252:         propSize = 0x10a80;
        !           253: 
        !           254:        // Check ati PEF exists there
        !           255:         if( patch[ 0x1f0 / 4 ] == 'ATIU') {
        !           256: 
        !           257:             pef = (IOLogicalAddress) IOMalloc( propSize );
        !           258:             bcopy( (void *) patch, (void *) pef, propSize );
        !           259:         }
        !           260:     }
        !           261: 
        !           262:     if( !pef && (0 == strcmp( regEntry->getName(), "ATY,mach64_3DUPro")) ) {
        !           263: 
        !           264:         int * patch;
        !           265: 
        !           266:         patch = (int *) 0xffe99510;
        !           267:         propSize = 0x12008;
        !           268:        // Check ati PEF exists there
        !           269:         if( patch[ 0x1fc / 4 ] != 'ATIU') {
        !           270: 
        !           271:             // silk version
        !           272:             patch = (int *) 0xffe99550;
        !           273:             propSize = 0x12058;
        !           274:             if( patch[ 0x1fc / 4 ] != 'ATIU')
        !           275:                propSize = 0;
        !           276:        }
        !           277: 
        !           278:        if( propSize) {
        !           279:             pef = (IOLogicalAddress) IOMalloc( propSize );
        !           280:             bcopy( (void *) patch, (void *) pef, propSize );
        !           281:         }
        !           282:     }
        !           283: 
        !           284:     if( !pef && (0 == strcmp( regEntry->getName(), "control")) ) {
        !           285: 
        !           286: #define ins(i,d,a,simm) ((i<<26)+(d<<21)+(a<<16)+simm)
        !           287:         int * patch;
        !           288: 
        !           289:         patch = (int *) 0xffe6bd50;
        !           290:         propSize = 0xac10;
        !           291: 
        !           292:        // Check control PEF exists there
        !           293:         if( patch[ 0x41ac / 4 ] == ins( 32, 3, 0, 0x544)) { // lwz r3,0x544(0)
        !           294: 
        !           295:             pef = (IOLogicalAddress) IOMalloc( propSize );
        !           296:             bcopy( (void *) patch, (void *) pef, propSize );
        !           297:             patch = (int *) pef;
        !           298:            // patch out low mem accesses
        !           299:             patch[ 0x8680 / 4 ] = ins( 14, 12, 0, 0);    // addi r12,0,0x0
        !           300:             patch[ 0x41ac / 4 ] = ins( 14, 3, 0, 0x544);  // addi r3,0,0x544;
        !           301:             patch[ 0x8fa0 / 4 ] = ins( 14, 3, 0, 0x648);  // addi r3,0,0x648;
        !           302:         }
        !           303:     }
        !           304: #endif
        !           305: 
        !           306:     if( pef) {
        !           307:         kprintf( "pef = %08x, %08x\n", pef, propSize );
        !           308:        inst = IONDRV::instantiate( pef, propSize );
        !           309:        if( inst )
        !           310:             regEntry->setProperty( "AAPL,ndrvInst", inst);
        !           311: 
        !           312:     } else
        !           313:        inst = 0;
        !           314: 
        !           315:     return( inst );
        !           316: }
        !           317: 
        !           318: const char * IONDRV::driverName( void )
        !           319: {
        !           320:     return( (const char *) theDriverDesc->driverOSRuntimeInfo.driverName);
        !           321: }
        !           322: 
        !           323: 

unix.superglobalmegacorp.com

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