X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/43866e378188c25dd1e2208016ab3cbeb086ae6c..cc9f6e38162d3c1bf6ca97536c2477f476c8e01b:/iokit/Kernel/IORegistryEntry.cpp diff --git a/iokit/Kernel/IORegistryEntry.cpp b/iokit/Kernel/IORegistryEntry.cpp index f95427287..78dbf3527 100644 --- a/iokit/Kernel/IORegistryEntry.cpp +++ b/iokit/Kernel/IORegistryEntry.cpp @@ -3,22 +3,19 @@ * * @APPLE_LICENSE_HEADER_START@ * - * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. * * @APPLE_LICENSE_HEADER_END@ */ @@ -47,6 +44,12 @@ OSDefineMetaClassAndStructors(IORegistryEntry, OSObject) /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +#define kIORegPlaneParentSuffix "ParentLinks" +#define kIORegPlaneChildSuffix "ChildLinks" +#define kIORegPlaneNameSuffix "Name" +#define kIORegPlaneLocationSuffix "Location" +#define kIORegPlaneParentSuffixLen (sizeof(kIORegPlaneParentSuffix) - 1) + static IORegistryEntry * gRegistryRoot; static OSDictionary * gIORegistryPlanes; @@ -106,7 +109,7 @@ static SInt32 gIORegistryGenerationCount; /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ struct s_lock_t { - decl_simple_lock_data(,interlock) /* "hardware" interlock field */ + lck_spin_t interlock; /* "hardware" interlock field */ volatile unsigned int read_count:16, /* No. of accepted readers */ want_upgrade:1, /* Read-to-write upgrade waiting */ @@ -137,7 +140,7 @@ s_lock_init( { (void) memset((void *) l, 0, sizeof(s_lock_t)); - simple_lock_init(&l->interlock, 0); + lck_spin_init(&l->interlock, IOLockGroup, LCK_ATTR_NULL); l->want_write = FALSE; l->want_upgrade = FALSE; l->read_count = 0; @@ -150,7 +153,7 @@ s_lock_write( { register int i; - simple_lock(&l->interlock); + lck_spin_lock(&l->interlock); /* * Try to acquire the want_write bit. @@ -159,17 +162,16 @@ s_lock_write( i = lock_wait_time[l->can_sleep ? 1 : 0]; if (i != 0) { - simple_unlock(&l->interlock); + lck_spin_unlock(&l->interlock); while (--i != 0 && l->want_write) continue; - simple_lock(&l->interlock); + lck_spin_lock(&l->interlock); } if (l->can_sleep && l->want_write) { l->waiting = TRUE; - thread_sleep_simple_lock((event_t) l, - simple_lock_addr(l->interlock), - THREAD_UNINT); + lck_spin_sleep( &l->interlock, LCK_SLEEP_DEFAULT, + (event_t) l, THREAD_UNINT); /* interlock relocked */ } } @@ -181,23 +183,22 @@ s_lock_write( i = lock_wait_time[l->can_sleep ? 1 : 0]; if (i != 0) { - simple_unlock(&l->interlock); + lck_spin_unlock(&l->interlock); while (--i != 0 && (l->read_count != 0 || l->want_upgrade)) continue; - simple_lock(&l->interlock); + lck_spin_lock(&l->interlock); } if (l->can_sleep && (l->read_count != 0 || l->want_upgrade)) { l->waiting = TRUE; - thread_sleep_simple_lock((event_t) l, - simple_lock_addr(l->interlock), - THREAD_UNINT); + lck_spin_sleep( &l->interlock, LCK_SLEEP_DEFAULT, + (event_t) l, THREAD_UNINT); /* interlock relocked */ } } - simple_unlock(&l->interlock); + lck_spin_unlock(&l->interlock); } static void @@ -206,7 +207,7 @@ s_lock_done( { boolean_t do_wakeup = FALSE; - simple_lock(&l->interlock); + lck_spin_lock(&l->interlock); if (l->read_count != 0) { l->read_count -= 1; @@ -232,7 +233,7 @@ s_lock_done( do_wakeup = TRUE; } - simple_unlock(&l->interlock); + lck_spin_unlock(&l->interlock); if (do_wakeup) thread_wakeup((event_t) l); @@ -244,32 +245,31 @@ s_lock_read( { register int i; - simple_lock(&l->interlock); + lck_spin_lock(&l->interlock); while ( l->want_upgrade || ((0 == l->read_count) && l->want_write )) { i = lock_wait_time[l->can_sleep ? 1 : 0]; if (i != 0) { - simple_unlock(&l->interlock); + lck_spin_unlock(&l->interlock); while (--i != 0 && (l->want_upgrade || ((0 == l->read_count) && l->want_write ))) continue; - simple_lock(&l->interlock); + lck_spin_lock(&l->interlock); } if (l->can_sleep && (l->want_upgrade || ((0 == l->read_count) && l->want_write ))) { l->waiting = TRUE; - thread_sleep_simple_lock((event_t) l, - simple_lock_addr(l->interlock), - THREAD_UNINT); + lck_spin_sleep( &l->interlock, LCK_SLEEP_DEFAULT, + (event_t) l, THREAD_UNINT); /* interlock relocked */ } } l->read_count += 1; - simple_unlock(&l->interlock); + lck_spin_unlock(&l->interlock); } @@ -330,16 +330,16 @@ const IORegistryPlane * IORegistryEntry::makePlane( const char * name ) nameKey = OSSymbol::withCString( key); - strcpy( end, "ParentLinks" ); + strcpy( end, kIORegPlaneParentSuffix ); parentKey = OSSymbol::withCString( key); - strcpy( end, "ChildLinks" ); + strcpy( end, kIORegPlaneChildSuffix ); childKey = OSSymbol::withCString( key); - strcpy( end, "Name" ); + strcpy( end, kIORegPlaneNameSuffix ); pathNameKey = OSSymbol::withCString( key); - strcpy( end, "Location" ); + strcpy( end, kIORegPlaneLocationSuffix ); pathLocationKey = OSSymbol::withCString( key); plane = new IORegistryPlane; @@ -396,7 +396,7 @@ bool IORegistryPlane::serialize(OSSerialize *s) const enum { kIORegCapacityIncrement = 4 }; -bool IORegistryEntry::init( OSDictionary * dict = 0 ) +bool IORegistryEntry::init( OSDictionary * dict ) { OSString * prop; @@ -523,19 +523,6 @@ void IORegistryEntry::setPropertyTable( OSDictionary * dict ) /* Wrappers to synchronize property table */ -#define wrap1(func, type, constant) \ -OSObject * \ -IORegistryEntry::func ## Property( type * aKey) constant \ -{ \ - OSObject * obj; \ - \ - PLOCK; \ - obj = getPropertyTable()->func ## Object( aKey ); \ - PUNLOCK; \ - \ - return( obj ); \ -} - #define wrap2(type, constant) \ OSObject * \ IORegistryEntry::copyProperty( type * aKey) constant \ @@ -551,15 +538,6 @@ IORegistryEntry::copyProperty( type * aKey) constant \ return( obj ); \ } -#define wrap3(func,type,constant) \ -void \ -IORegistryEntry::func ## Property( type * aKey) constant \ -{ \ - PLOCK; \ - getPropertyTable()->func ## Object( aKey ); \ - PUNLOCK; \ -} - #define wrap4(type,constant) \ OSObject * \ IORegistryEntry::getProperty( type * aKey, \ @@ -610,14 +588,14 @@ IORegistryEntry::copyProperty( type * aKey, \ bool IORegistryEntry::serializeProperties( OSSerialize * s ) const { - bool ok; - // setProperty( getRetainCount(), 32, "__retain" ); PLOCK; - ok = getPropertyTable()->serialize( s ); + OSCollection *snapshotProperties = getPropertyTable()->copyCollection(); PUNLOCK; + bool ok = snapshotProperties->serialize( s ); + snapshotProperties->release(); return( ok ); } @@ -638,18 +616,10 @@ IOReturn IORegistryEntry::setProperties( OSObject * properties ) return( kIOReturnUnsupported ); } -wrap1(get, const OSSymbol, const) // getProperty() definition -wrap1(get, const OSString, const) // getProperty() definition -wrap1(get, const char, const) // getProperty() definition - wrap2(const OSSymbol, const) // copyProperty() definition wrap2(const OSString, const) // copyProperty() definition wrap2(const char, const) // copyProperty() definition -wrap3(remove, const OSSymbol,) // removeProperty() definition -wrap3(remove, const OSString,) // removeProperty() definition -wrap3(remove, const char,) // removeProperty() definition - wrap4(const OSSymbol, const) // getProperty() w/plane definition wrap4(const OSString, const) // getProperty() w/plane definition wrap4(const char, const) // getProperty() w/plane definition @@ -659,36 +629,115 @@ wrap5(const OSString, const) // copyProperty() w/plane definition wrap5(const char, const) // copyProperty() w/plane definition +OSObject * +IORegistryEntry::getProperty( const OSSymbol * aKey) const +{ + OSObject * obj; + + PLOCK; + obj = getPropertyTable()->getObject( aKey ); + PUNLOCK; + + return( obj ); +} + +void +IORegistryEntry::removeProperty( const OSSymbol * aKey) +{ + PLOCK; + getPropertyTable()->removeObject( aKey ); + PUNLOCK; +} + bool IORegistryEntry::setProperty( const OSSymbol * aKey, OSObject * anObject) { bool ret = false; + + // If we are inserting a collection class and the current entry + // is attached into the registry (inPlane()) then mark the collection + // as immutable. + OSCollection *coll = OSDynamicCast(OSCollection, anObject); + bool makeImmutable = (coll && inPlane()); + PLOCK; + if( makeImmutable ) + coll->setOptions( OSCollection::kMASK, OSCollection::kImmutable ); + ret = getPropertyTable()->setObject( aKey, anObject ); PUNLOCK; return ret; } -bool -IORegistryEntry::setProperty( const OSString * aKey, OSObject * anObject) +IOReturn IORegistryEntry:: +runPropertyAction(Action inAction, OSObject *target, + void *arg0, void *arg1, void *arg2, void *arg3) { - bool ret = false; + IOReturn res; + + // closeGate is recursive so don't worry if we already hold the lock. PLOCK; - ret = getPropertyTable()->setObject( aKey, anObject ); + res = (*inAction)(target, arg0, arg1, arg2, arg3); PUNLOCK; + return res; +} + +OSObject * +IORegistryEntry::getProperty( const OSString * aKey) const +{ + const OSSymbol * tmpKey = OSSymbol::withString( aKey ); + OSObject * obj = getProperty( tmpKey ); + + tmpKey->release(); + return( obj ); +} + +OSObject * +IORegistryEntry::getProperty( const char * aKey) const +{ + const OSSymbol * tmpKey = OSSymbol::withCString( aKey ); + OSObject * obj = getProperty( tmpKey ); + + tmpKey->release(); + return( obj ); +} + + +void +IORegistryEntry::removeProperty( const OSString * aKey) +{ + const OSSymbol * tmpKey = OSSymbol::withString( aKey ); + removeProperty( tmpKey ); + tmpKey->release(); +} + +void +IORegistryEntry::removeProperty( const char * aKey) +{ + const OSSymbol * tmpKey = OSSymbol::withCString( aKey ); + removeProperty( tmpKey ); + tmpKey->release(); +} + +bool +IORegistryEntry::setProperty( const OSString * aKey, OSObject * anObject) +{ + const OSSymbol * tmpKey = OSSymbol::withString( aKey ); + bool ret = setProperty( tmpKey, anObject ); + + tmpKey->release(); return ret; } bool IORegistryEntry::setProperty( const char * aKey, OSObject * anObject) { - bool ret = false; - PLOCK; - ret = getPropertyTable()->setObject( aKey, anObject ); - PUNLOCK; - + const OSSymbol * tmpKey = OSSymbol::withCString( aKey ); + bool ret = setProperty( tmpKey, anObject ); + + tmpKey->release(); return ret; } @@ -699,9 +748,10 @@ IORegistryEntry::setProperty(const char * aKey, const char * aString) OSSymbol * aSymbol = (OSSymbol *) OSSymbol::withCString( aString ); if( aSymbol) { - PLOCK; - ret = getPropertyTable()->setObject( aKey, aSymbol ); - PUNLOCK; + const OSSymbol * tmpKey = OSSymbol::withCString( aKey ); + ret = setProperty( tmpKey, aSymbol ); + + tmpKey->release(); aSymbol->release(); } return( ret ); @@ -714,9 +764,10 @@ IORegistryEntry::setProperty(const char * aKey, bool aBoolean) OSBoolean * aBooleanObj = OSBoolean::withBoolean( aBoolean ); if( aBooleanObj) { - PLOCK; - ret = getPropertyTable()->setObject( aKey, aBooleanObj ); - PUNLOCK; + const OSSymbol * tmpKey = OSSymbol::withCString( aKey ); + ret = setProperty( tmpKey, aBooleanObj ); + + tmpKey->release(); aBooleanObj->release(); } return( ret ); @@ -731,9 +782,10 @@ IORegistryEntry::setProperty( const char * aKey, OSNumber * anOffset = OSNumber::withNumber( aValue, aNumberOfBits ); if( anOffset) { - PLOCK; - ret = getPropertyTable()->setObject( aKey, anOffset ); - PUNLOCK; + const OSSymbol * tmpKey = OSSymbol::withCString( aKey ); + ret = setProperty( tmpKey, anOffset ); + + tmpKey->release(); anOffset->release(); } return( ret ); @@ -748,9 +800,10 @@ IORegistryEntry::setProperty( const char * aKey, OSData * data = OSData::withBytes( bytes, length ); if( data) { - PLOCK; - ret = getPropertyTable()->setObject( aKey, data ); - PUNLOCK; + const OSSymbol * tmpKey = OSSymbol::withCString( aKey ); + ret = setProperty( tmpKey, data ); + + tmpKey->release(); data->release(); } return( ret ); @@ -760,7 +813,7 @@ IORegistryEntry::setProperty( const char * aKey, /* Name, location, paths */ -const char * IORegistryEntry::getName( const IORegistryPlane * plane = 0 ) const +const char * IORegistryEntry::getName( const IORegistryPlane * plane ) const { OSSymbol * sym = 0; @@ -778,7 +831,7 @@ const char * IORegistryEntry::getName( const IORegistryPlane * plane = 0 ) const } const OSSymbol * IORegistryEntry::copyName( - const IORegistryPlane * plane = 0 ) const + const IORegistryPlane * plane ) const { OSSymbol * sym = 0; @@ -798,7 +851,7 @@ const OSSymbol * IORegistryEntry::copyName( } const OSSymbol * IORegistryEntry::copyLocation( - const IORegistryPlane * plane = 0 ) const + const IORegistryPlane * plane ) const { OSSymbol * sym = 0; @@ -814,7 +867,7 @@ const OSSymbol * IORegistryEntry::copyLocation( return( sym ); } -const char * IORegistryEntry::getLocation( const IORegistryPlane * plane = 0 ) const +const char * IORegistryEntry::getLocation( const IORegistryPlane * plane ) const { const OSSymbol * sym = copyLocation( plane ); const char * result = 0; @@ -828,7 +881,7 @@ const char * IORegistryEntry::getLocation( const IORegistryPlane * plane = 0 ) c } void IORegistryEntry::setName( const OSSymbol * name, - const IORegistryPlane * plane = 0 ) + const IORegistryPlane * plane ) { const OSSymbol * key; @@ -845,7 +898,7 @@ void IORegistryEntry::setName( const OSSymbol * name, } void IORegistryEntry::setName( const char * name, - const IORegistryPlane * plane = 0 ) + const IORegistryPlane * plane ) { OSSymbol * sym = (OSSymbol *)OSSymbol::withCString( name ); if ( sym ) { @@ -855,7 +908,7 @@ void IORegistryEntry::setName( const char * name, } void IORegistryEntry::setLocation( const OSSymbol * location, - const IORegistryPlane * plane = 0 ) + const IORegistryPlane * plane ) { const OSSymbol * key; @@ -872,7 +925,7 @@ void IORegistryEntry::setLocation( const OSSymbol * location, } void IORegistryEntry::setLocation( const char * location, - const IORegistryPlane * plane = 0 ) + const IORegistryPlane * plane ) { OSSymbol * sym = (OSSymbol *)OSSymbol::withCString( location ); if ( sym ) { @@ -882,7 +935,7 @@ void IORegistryEntry::setLocation( const char * location, } bool -IORegistryEntry::compareName( OSString * name, OSString ** matched = 0 ) const +IORegistryEntry::compareName( OSString * name, OSString ** matched ) const { const OSSymbol * sym = copyName(); bool isEqual; @@ -901,7 +954,7 @@ IORegistryEntry::compareName( OSString * name, OSString ** matched = 0 ) const } bool -IORegistryEntry::compareNames( OSObject * names, OSString ** matched = 0 ) const +IORegistryEntry::compareNames( OSObject * names, OSString ** matched ) const { OSString * string; OSCollection * collection; @@ -1068,39 +1121,38 @@ const char * IORegistryEntry::matchPathLocation( const char * cmp, const char * str; const char * result = 0; u_quad_t num1, num2; - char c1, c2; + char lastPathChar, lastLocationChar; str = getLocation( plane ); if( str) { - c2 = str[0]; + lastPathChar = cmp[0]; + lastLocationChar = str[0]; do { - num1 = strtouq( cmp, (char **) &cmp, 16 ); - if( c2) { + if( lastPathChar) { + num1 = strtouq( cmp, (char **) &cmp, 16 ); + lastPathChar = *cmp++; + } else + num1 = 0; + + if( lastLocationChar) { num2 = strtouq( str, (char **) &str, 16 ); - c2 = str[0]; + lastLocationChar = *str++; } else num2 = 0; if( num1 != num2) break; - c1 = *cmp++; - - if( (c2 == ':') && (c2 == c1)) { - str++; - continue; - } - - if( ',' != c1) { + if (!lastPathChar && !lastLocationChar) { result = cmp - 1; break; } - if( c2) { - if( c2 != ',') - break; - str++; - } + if( (',' != lastPathChar) && (':' != lastPathChar)) + lastPathChar = 0; + + if (lastPathChar && lastLocationChar && (lastPathChar != lastLocationChar)) + break; } while( true); } @@ -1156,7 +1208,7 @@ IORegistryEntry * IORegistryEntry::getChildFromComponent( const char ** opath, } const OSSymbol * IORegistryEntry::hasAlias( const IORegistryPlane * plane, - char * opath = 0, int * length = 0 ) const + char * opath, int * length ) const { IORegistryEntry * entry; IORegistryEntry * entry2; @@ -1238,10 +1290,10 @@ const char * IORegistryEntry::dealiasPath( IORegistryEntry * IORegistryEntry::fromPath( const char * path, - const IORegistryPlane * plane = 0, - char * opath = 0, - int * length = 0, - IORegistryEntry * fromEntry = 0 ) + const IORegistryPlane * plane, + char * opath, + int * length, + IORegistryEntry * fromEntry ) { IORegistryEntry * where = 0; IORegistryEntry * aliasEntry = 0; @@ -1334,9 +1386,9 @@ IORegistryEntry * IORegistryEntry::fromPath( IORegistryEntry * IORegistryEntry::childFromPath( const char * path, - const IORegistryPlane * plane = 0, - char * opath = 0, - int * len = 0 ) + const IORegistryPlane * plane, + char * opath, + int * len ) { return( IORegistryEntry::fromPath( path, plane, opath, len, this )); } @@ -1350,7 +1402,7 @@ IORegistryEntry * IORegistryEntry::childFromPath( inline bool IORegistryEntry::arrayMember( OSArray * set, const IORegistryEntry * member, - unsigned int * index = 0 ) const + unsigned int * index ) const { int i; OSObject * probeObject; @@ -1381,7 +1433,7 @@ bool IORegistryEntry::makeLink( IORegistryEntry * to, } else { - links = OSArray::withObjects( & (const OSObject *) to, 1, 1 ); + links = OSArray::withObjects( (const OSObject **) &to, 1, 1 ); result = (links != 0); if( result) { result = registryTable()->setObject( plane->keys[ relation ], @@ -1587,7 +1639,7 @@ void IORegistryEntry::applyToParents( IORegistryEntryApplierFunction applier, bool IORegistryEntry::isChild( IORegistryEntry * child, const IORegistryPlane * plane, - bool onlyChild = false ) const + bool onlyChild ) const { OSArray * links; bool ret = false; @@ -1608,7 +1660,7 @@ bool IORegistryEntry::isChild( IORegistryEntry * child, bool IORegistryEntry::isParent( IORegistryEntry * parent, const IORegistryPlane * plane, - bool onlyParent = false ) const + bool onlyParent ) const { OSArray * links; @@ -1634,7 +1686,34 @@ bool IORegistryEntry::inPlane( const IORegistryPlane * plane ) const RLOCK; - ret = (0 != getParentSetReference( plane )); + if( plane) + ret = (0 != getParentSetReference( plane )); + else { + + // Check to see if this is in any plane. If it is in a plane + // then the registryTable will contain a key with the ParentLinks + // suffix. When we iterate over the keys looking for that suffix + ret = false; + + OSCollectionIterator *iter = + OSCollectionIterator::withCollection( registryTable()); + if( iter) { + const OSSymbol *key; + + while( (key = (OSSymbol *) iter->getNextObject()) ) { + const char *keysuffix; + + // Get a pointer to this keys suffix + keysuffix = key->getCStringNoCopy() + + key->getLength() - kIORegPlaneParentSuffixLen; + if( !strcmp(keysuffix, kIORegPlaneParentSuffix) ) { + ret = true; + break; + } + } + iter->release(); + } + } UNLOCK; @@ -1660,10 +1739,33 @@ bool IORegistryEntry::attachToParent( IORegistryEntry * parent, else needParent = true; -// ret &= parent->makeLink( this, kChildSetIndex, plane ); - UNLOCK; + PLOCK; + + // Mark any collections in the property list as immutable + OSDictionary *ptable = getPropertyTable(); + OSCollectionIterator *iter = + OSCollectionIterator::withCollection( ptable ); + if( iter) { + const OSSymbol *key; + + while( (key = (OSSymbol *) iter->getNextObject( ))) { + // Is object for key a collection? + OSCollection *coll = + OSDynamicCast( OSCollection, ptable->getObject( key )); + + if( coll) { + // Yup so mark it as immutable + coll->setOptions( OSCollection::kMASK, + OSCollection::kImmutable ); + } + } + iter->release(); + } + + PUNLOCK; + if( needParent) ret &= parent->attachToChild( this, plane ); @@ -1839,7 +1941,7 @@ enum { kIORegistryIteratorInvalidFlag = 0x80000000 }; IORegistryIterator * IORegistryIterator::iterateOver( IORegistryEntry * root, const IORegistryPlane * plane, - IOOptionBits options = 0 ) + IOOptionBits options ) { IORegistryIterator * create; @@ -1869,7 +1971,7 @@ IORegistryIterator::iterateOver( IORegistryEntry * root, IORegistryIterator * IORegistryIterator::iterateOver( const IORegistryPlane * plane, - IOOptionBits options = 0 ) + IOOptionBits options ) { return( iterateOver( gRegistryRoot, plane, options )); } @@ -2051,8 +2153,8 @@ OSMetaClassDefineReservedUsed(IORegistryEntry, 1); OSMetaClassDefineReservedUsed(IORegistryEntry, 2); OSMetaClassDefineReservedUsed(IORegistryEntry, 3); OSMetaClassDefineReservedUsed(IORegistryEntry, 4); +OSMetaClassDefineReservedUsed(IORegistryEntry, 5); -OSMetaClassDefineReservedUnused(IORegistryEntry, 5); OSMetaClassDefineReservedUnused(IORegistryEntry, 6); OSMetaClassDefineReservedUnused(IORegistryEntry, 7); OSMetaClassDefineReservedUnused(IORegistryEntry, 8);