X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/89b3af67bb32e691275bf6fa803d1834b2284115..36401178fd6817c043cc00b0c00c7f723e58efae:/iokit/bsddev/IOKitBSDInit.cpp diff --git a/iokit/bsddev/IOKitBSDInit.cpp b/iokit/bsddev/IOKitBSDInit.cpp index 48d9399a9..7621a257f 100644 --- a/iokit/bsddev/IOKitBSDInit.cpp +++ b/iokit/bsddev/IOKitBSDInit.cpp @@ -36,6 +36,7 @@ extern "C" { #include #include +#include // how long to wait for matching root device, secs #define ROOTDEVICETIMEOUT 60 @@ -167,7 +168,8 @@ OSDictionary * IONetworkNamePrefixMatching( const char * prefix ) OSDictionary * matching; OSDictionary * propDict = 0; const OSSymbol * str = 0; - + char networkType[128]; + do { matching = IOService::serviceMatching( "IONetworkInterface" ); if ( matching == 0 ) @@ -185,6 +187,18 @@ OSDictionary * IONetworkNamePrefixMatching( const char * prefix ) str->release(); str = 0; + // see if we're contrained to netroot off of specific network type + if(PE_parse_boot_argn( "network-type", networkType, 128 )) + { + str = OSSymbol::withCString( networkType ); + if(str) + { + propDict->setObject( "IONetworkRootType", str); + str->release(); + str = 0; + } + } + if ( matching->setObject( gIOPropertyMatchKey, (OSObject *) propDict ) != true ) continue; @@ -440,7 +454,7 @@ kern_return_t IOFindBSDRoot( char * rootName, UInt32 *ramdParms = 0; UInt32 flags = 0; - int minor, major; + int mnr, mjr; bool findHFSChild = false; char * mediaProperty = 0; char * rdBootVar; @@ -465,8 +479,8 @@ kern_return_t IOFindBSDRoot( char * rootName, return( kIOReturnNoMemory ); rdBootVar = str + kMaxPathBuf; - if (!PE_parse_boot_arg("rd", rdBootVar ) - && !PE_parse_boot_arg("rootdev", rdBootVar )) + if (!PE_parse_boot_argn("rd", rdBootVar, kMaxBootVar ) + && !PE_parse_boot_argn("rootdev", rdBootVar, kMaxBootVar )) rdBootVar[0] = 0; do { @@ -605,7 +619,7 @@ kern_return_t IOFindBSDRoot( char * rootName, uuid = (char *)IOMalloc( kMaxBootVar ); if ( uuid ) { - if (!PE_parse_boot_arg( "boot-uuid", uuid )) { + if (!PE_parse_boot_argn( "boot-uuid", uuid, kMaxBootVar )) { panic( "rd=uuid but no boot-uuid= specified" ); } uuidString = OSString::withCString( uuid ); @@ -624,8 +638,9 @@ kern_return_t IOFindBSDRoot( char * rootName, } if( !matching) { - OSString * astring; - // any HFS + OSString * astring; + // Match any HFS media + matching = IOService::serviceMatching( "IOMedia" ); astring = OSString::withCStringNoCopy("Apple_HFS"); if ( astring ) { @@ -688,8 +703,8 @@ kern_return_t IOFindBSDRoot( char * rootName, service = (IOService *)service->getProperty(mediaProperty); } - major = 0; - minor = 0; + mjr = 0; + mnr = 0; // If the IOService we matched to is a subclass of IONetworkInterface, // then make sure it has been registered with BSD and has a BSD name @@ -713,10 +728,10 @@ kern_return_t IOFindBSDRoot( char * rootName, strcpy( rootName, iostr->getCStringNoCopy() ); off = (OSNumber *) service->getProperty( kIOBSDMajorKey ); if( off) - major = off->unsigned32BitValue(); + mjr = off->unsigned32BitValue(); off = (OSNumber *) service->getProperty( kIOBSDMinorKey ); if( off) - minor = off->unsigned32BitValue(); + mnr = off->unsigned32BitValue(); if( service->metaCast( "IONetworkInterface" )) flags |= 1; @@ -729,12 +744,12 @@ kern_return_t IOFindBSDRoot( char * rootName, } IOLog( "BSD root: %s", rootName ); - if( major) - IOLog(", major %d, minor %d\n", major, minor ); + if( mjr) + IOLog(", major %d, minor %d\n", mjr, mnr ); else IOLog("\n"); - *root = makedev( major, minor ); + *root = makedev( mjr, mnr ); *oflags = flags; IOFree( str, kMaxPathBuf + kMaxBootVar ); @@ -758,6 +773,20 @@ iofrootx: return( kIOReturnSuccess ); } +void IOSecureBSDRoot(const char * rootName) +{ +#if CONFIG_EMBEDDED + IOPlatformExpert *pe; + const OSSymbol *functionName = OSSymbol::withCStringNoCopy("SecureRootName"); + + while ((pe = IOService::getPlatform()) == 0) IOSleep(1 * 1000); + + pe->callPlatformFunction(functionName, false, (void *)rootName, (void *)0, (void *)0, (void *)0); + + functionName->release(); +#endif +} + void * IOBSDRegistryEntryForDeviceTree(char * path) { @@ -789,4 +818,20 @@ IOBSDRegistryEntryGetData(void * entry, char * property_name, return (NULL); } +kern_return_t IOBSDGetPlatformUUID( uuid_t uuid, mach_timespec_t timeout ) +{ + IOService * resources; + OSString * string; + + resources = IOService::waitForService( IOService::resourceMatching( kIOPlatformUUIDKey ), &timeout ); + if ( resources == 0 ) return KERN_OPERATION_TIMED_OUT; + + string = ( OSString * ) IOService::getPlatform( )->getProvider( )->getProperty( kIOPlatformUUIDKey ); + if ( string == 0 ) return KERN_NOT_SUPPORTED; + + uuid_parse( string->getCStringNoCopy( ), uuid ); + + return KERN_SUCCESS; +} + } /* extern "C" */