X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/c0fea4742e91338fffdcf79f86a7c1d5e2b97eb1..94ff46dc2849db4d43eaaf144872decc522aafb4:/iokit/IOKit/IOMapper.h?ds=sidebyside diff --git a/iokit/IOKit/IOMapper.h b/iokit/IOKit/IOMapper.h index 6507f5d7e..df5214478 100644 --- a/iokit/IOKit/IOMapper.h +++ b/iokit/IOKit/IOMapper.h @@ -1,23 +1,29 @@ /* - * Copyright (c) 1998-2003 Apple Computer, Inc. All rights reserved. + * Copyright (c) 1998-2016 Apple Inc. All rights reserved. * - * @APPLE_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 Original Code and all software distributed under the License are - * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * 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. + * + * 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. - * - * @APPLE_LICENSE_HEADER_END@ + * 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_OSREFERENCE_LICENSE_HEADER_END@ */ #ifndef __IOKIT_IOMAPPER_H @@ -32,16 +38,7 @@ __BEGIN_DECLS // These are C accessors to the system mapper for non-IOKit clients ppnum_t IOMapperIOVMAlloc(unsigned pages); void IOMapperIOVMFree(ppnum_t addr, unsigned pages); - ppnum_t IOMapperInsertPage(ppnum_t addr, unsigned offset, ppnum_t page); -void IOMapperInsertPPNPages(ppnum_t addr, unsigned offset, - ppnum_t *pageList, unsigned pageCount); -void IOMapperInsertUPLPages(ppnum_t addr, unsigned offset, - upl_page_info_t *pageList, unsigned pageCount); - -mach_vm_address_t IOMallocPhysical(mach_vm_size_t size, mach_vm_address_t mask); - -void IOFreePhysical(mach_vm_address_t address, mach_vm_size_t size); __END_DECLS @@ -49,94 +46,108 @@ __END_DECLS #include #include +#include class OSData; +extern const OSSymbol * gIOMapperIDKey; + class IOMapper : public IOService { - OSDeclareAbstractStructors(IOMapper); + OSDeclareAbstractStructors(IOMapper); - // Give the platform expert access to setMapperRequired(); - friend class IOPlatformExpert; +// Give the platform expert access to setMapperRequired(); + friend class IOPlatformExpert; + friend class IOMemoryDescriptor; + friend class IOGeneralMemoryDescriptor; private: - enum SystemMapperState { - kNoMapper = 0, - kUnknown = 1, - kHasMapper = 2, // Any other value is pointer to a live mapper - kWaitMask = 3, - }; + enum SystemMapperState { + kNoMapper = 0, + kUnknown = 1, + kHasMapper = 2, // Any other value is pointer to a live mapper + kWaitMask = 3, + }; protected: - void *fTable; - ppnum_t fTablePhys; - IOItemCount fTableSize; - OSData *fTableHandle; - bool fIsSystem; +#ifdef XNU_KERNEL_PRIVATE + uint64_t __reservedA[6]; + kern_allocation_name_t fAllocName; + uint32_t __reservedB; + uint32_t fPageSize; +#else + uint64_t __reserved[8]; +#endif + bool fIsSystem; + static void setMapperRequired(bool hasMapper); + static void waitForSystemMapper(); - static void setMapperRequired(bool hasMapper); - static void waitForSystemMapper(); + virtual bool initHardware(IOService *provider) = 0; - virtual bool initHardware(IOService *provider) = 0; +public: + virtual bool start(IOService *provider) APPLE_KEXT_OVERRIDE; + virtual void free() APPLE_KEXT_OVERRIDE; - virtual bool allocTable(IOByteCount size); +// To get access to the system mapper IOMapper::gSystem + static IOMapper *gSystem; -public: -#if !(defined(__ppc__) && defined(KPI_10_4_0_PPC_COMPAT)) - virtual bool start(IOService *provider); - virtual void free(); -#endif + static void + checkForSystemMapper() + { + if ((uintptr_t) gSystem & kWaitMask) { + waitForSystemMapper(); + } + } - // Static routines capable of allocating tables that are physically - // contiguous in real memory space. - static OSData * NewARTTable(IOByteCount size, - void ** virtAddrP, ppnum_t *physAddrP); - static void FreeARTTable(OSData *handle, IOByteCount size); + static IOMapper * copyMapperForDevice(IOService * device); + static IOMapper * copyMapperForDeviceWithIndex(IOService * device, unsigned int index); +// { subclasses - // To get access to the system mapper IOMapper::gSystem - static IOMapper *gSystem; + virtual uint64_t getPageSize(void) const = 0; - virtual ppnum_t iovmAlloc(IOItemCount pages) = 0; - virtual void iovmFree(ppnum_t addr, IOItemCount pages) = 0; + virtual IOReturn iovmMapMemory(IOMemoryDescriptor * memory, + uint64_t descriptorOffset, + uint64_t length, + uint32_t mapOptions, + const IODMAMapSpecification * mapSpecification, + IODMACommand * dmaCommand, + const IODMAMapPageList * pageList, + uint64_t * mapAddress, + uint64_t * mapLength) = 0; - virtual void iovmInsert(ppnum_t addr, IOItemCount offset, ppnum_t page) = 0; - virtual void iovmInsert(ppnum_t addr, IOItemCount offset, - ppnum_t *pageList, IOItemCount pageCount); - virtual void iovmInsert(ppnum_t addr, IOItemCount offset, - upl_page_info_t *pageList, IOItemCount pageCount); - static void checkForSystemMapper() - { if ((vm_address_t) gSystem & kWaitMask) waitForSystemMapper(); }; + virtual IOReturn iovmUnmapMemory(IOMemoryDescriptor * memory, + IODMACommand * dmaCommand, + uint64_t mapAddress, + uint64_t mapLength) = 0; - // Function will panic if the given address is not found in a valid - // iovm mapping. - virtual addr64_t mapAddr(IOPhysicalAddress addr) = 0; + virtual IOReturn iovmInsert(uint32_t options, + uint64_t mapAddress, + uint64_t offset, + uint64_t physicalAddress, + uint64_t length) = 0; -#if !(defined(__ppc__) && defined(KPI_10_4_0_PPC_COMPAT)) - // Get the address mask to or into an address to bypass this mapper - virtual bool getBypassMask(addr64_t *maskP) const - OSMetaClassDeclareReservedUsed(IOMapper, 0); -#endif + virtual uint64_t mapToPhysicalAddress(uint64_t mappedAddress) = 0; + +// } private: -#if (defined(__ppc__) && defined(KPI_10_4_0_PPC_COMPAT)) - OSMetaClassDeclareReservedUnused(IOMapper, 0); -#endif - OSMetaClassDeclareReservedUnused(IOMapper, 1); - OSMetaClassDeclareReservedUnused(IOMapper, 2); - OSMetaClassDeclareReservedUnused(IOMapper, 3); - OSMetaClassDeclareReservedUnused(IOMapper, 4); - OSMetaClassDeclareReservedUnused(IOMapper, 5); - OSMetaClassDeclareReservedUnused(IOMapper, 6); - OSMetaClassDeclareReservedUnused(IOMapper, 7); - OSMetaClassDeclareReservedUnused(IOMapper, 8); - OSMetaClassDeclareReservedUnused(IOMapper, 9); - OSMetaClassDeclareReservedUnused(IOMapper, 10); - OSMetaClassDeclareReservedUnused(IOMapper, 11); - OSMetaClassDeclareReservedUnused(IOMapper, 12); - OSMetaClassDeclareReservedUnused(IOMapper, 13); - OSMetaClassDeclareReservedUnused(IOMapper, 14); - OSMetaClassDeclareReservedUnused(IOMapper, 15); + OSMetaClassDeclareReservedUnused(IOMapper, 0); + OSMetaClassDeclareReservedUnused(IOMapper, 1); + OSMetaClassDeclareReservedUnused(IOMapper, 2); + OSMetaClassDeclareReservedUnused(IOMapper, 3); + OSMetaClassDeclareReservedUnused(IOMapper, 4); + OSMetaClassDeclareReservedUnused(IOMapper, 5); + OSMetaClassDeclareReservedUnused(IOMapper, 6); + OSMetaClassDeclareReservedUnused(IOMapper, 7); + OSMetaClassDeclareReservedUnused(IOMapper, 8); + OSMetaClassDeclareReservedUnused(IOMapper, 9); + OSMetaClassDeclareReservedUnused(IOMapper, 10); + OSMetaClassDeclareReservedUnused(IOMapper, 11); + OSMetaClassDeclareReservedUnused(IOMapper, 12); + OSMetaClassDeclareReservedUnused(IOMapper, 13); + OSMetaClassDeclareReservedUnused(IOMapper, 14); + OSMetaClassDeclareReservedUnused(IOMapper, 15); }; #endif /* __cplusplus */