/*
- * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 1998-2012 Apple Inc. All rights reserved.
*
- * @APPLE_LICENSE_HEADER_START@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
*
- * 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. The rights granted to you under the License
+ * may not be used to create, or enable the creation or redistribution of,
+ * unlawful or unlicensed copies of an Apple operating system, or to
+ * circumvent, violate, or enable the circumvention or violation of, any
+ * terms of an Apple operating system software license agreement.
*
- * This Original Code and all software distributed under the License are
- * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * 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
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
- * License for the specific language governing rights and limitations
- * under the License.
+ * 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.
*
- * @APPLE_LICENSE_HEADER_END@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
*/
/*
- * Copyright (c) 1998 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 1998 Apple Inc. All rights reserved.
*
* HISTORY
*
OSDeclareDefaultStructors(IOCatalogue)
private:
- OSCollectionIterator * kernelTables;
- OSArray * array;
- IOLock * lock;
+ IORWLock * lock;
SInt32 generation;
+ OSDictionary * personalities;
+ OSArray * arrayForPersonality(OSDictionary * dict);
+ void addPersonality(OSDictionary * dict);
public:
/*!
@function free
@abstract Cleans up the database and deallocates memory allocated at initialization. This is never called in normal operation of the system.
*/
- void free( void );
+ void free( void ) APPLE_KEXT_OVERRIDE;
/*!
@function findDrivers
/*!
@function terminateDrivers
@abstract Terminates all instances of a driver which match the contents of the matching dictionary. Does not unload module.
- @param matching Dictionary containing the matching criteria.
+ @param matching A dictionary whose keys and values are used for matching personalities in the database. For example, a matching dictionary containing a 'IOProviderClass' key with the value 'IOPCIDevice' will cause termination for all instances whose personalities have the key 'IOProviderClass' equal to 'IOPCIDevice'.
*/
IOReturn terminateDrivers( OSDictionary * matching );
/*!
@function startMatching
@abstract Starts an IOService matching thread where matching keys and values are provided by the matching dictionary.
- @param matching A dictionary containing keys and values to match against.
+ @param matching A dictionary whose keys and values are used for matching personalities in the database. For example, a matching dictionary containing a 'IOProviderClass' key with the value 'IOPCIDevice' will start matching for all personalities which have the key 'IOProviderClass' equal to 'IOPCIDevice'.
*/
bool startMatching( OSDictionary * matching );
/*!
@function reset
@abstract Return the Catalogue to its initial state.
+ @discussion
+ Should only be used by kextd just before it sends all kext personalities down during a rescan.
*/
void reset(void);
+ /*!
+ @function resetAndAddDrivers
+ @abstract Replace personalities in IOCatalog with those provided.
+ @discussion
+ Resets the catalogue with a new set of drivers, preserving matching originals to keep wired memory usage down.
+ */
+ bool resetAndAddDrivers(OSArray * drivers, bool doNubMatching = true);
+
/*!
@function serialize
@abstract Serializes the catalog for transport to the user.
@param s The serializer object.
@result Returns false if unable to serialize database, most likely due to memory shortage.
*/
- virtual bool serialize(OSSerialize * s) const;
-
-
- /*!
- @function recordStartupExtensions
- @abstract Records extensions made available by the primary booter.
- <p>
- This function is for internal use by the kernel startup linker.
- Kernel extensions should never call it.
- @result Returns true if startup extensions were successfully recorded,
- false if not.
- */
- virtual bool recordStartupExtensions(void);
-
- /*!
- @function addExtensionsFromArchive()
- @abstract Records an archive of extensions, as from device ROM.
- <p>
- This function is currently for internal use.
- Kernel extensions should never call it.
- @param mkext An OSData object containing a multikext archive.
- @result Returns true if mkext was properly unserialized and its
- contents recorded, false if not.
- */
- virtual bool addExtensionsFromArchive(OSData * mkext);
+ virtual bool serialize(OSSerialize * s) const APPLE_KEXT_OVERRIDE;
+ bool serializeData(IOOptionBits kind, OSSerialize * s) const;
- /*!
- @function removeKernelLinker
- @abstract Removes from memory all code and data related to
- boot-time loading of kernel extensions. kextd triggers
- this when it first starts in order to pass responsibility
- for loading extensions from the kernel itself to kextd.
- @result Returns KERN_SUCCESS if the kernel linker is successfully
- removed or wasn't present, KERN_FAILURE otherwise.
- */
- virtual kern_return_t removeKernelLinker(void);
+/* This stuff is no longer used at all we keep it around for i386
+ * binary compatibility only. Symbols are no longer exported.
+ */
private:
*/
IOReturn unloadModule( OSString * moduleName ) const;
-
+ IOReturn _removeDrivers(OSDictionary * matching);
+ IOReturn _terminateDrivers(OSDictionary * matching);
};
-__BEGIN_DECLS
-/*!
- @function IOKitRelocStart
- @abstract Deprecated API.
-*/
-kmod_start_func_t IOKitRelocStart;
-/*!
- @function IOKitRelocStop
- @abstract Deprecated API.
-*/
-kmod_stop_func_t IOKitRelocStop;
-__END_DECLS
-
-extern const OSSymbol * gIOClassKey;
-extern const OSSymbol * gIOProbeScoreKey;
-extern IOCatalogue * gIOCatalogue;
+extern const OSSymbol * gIOClassKey;
+extern const OSSymbol * gIOProbeScoreKey;
+extern IOCatalogue * gIOCatalogue;
#endif /* ! _IOKIT_IOCATALOGUE_H */