1*d4514f0bSApple OSS Distributions/* 2*d4514f0bSApple OSS Distributions * Copyright (c) 2019-2019 Apple Inc. All rights reserved. 3*d4514f0bSApple OSS Distributions * 4*d4514f0bSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5*d4514f0bSApple OSS Distributions * 6*d4514f0bSApple OSS Distributions * This file contains Original Code and/or Modifications of Original Code 7*d4514f0bSApple OSS Distributions * as defined in and that are subject to the Apple Public Source License 8*d4514f0bSApple OSS Distributions * Version 2.0 (the 'License'). You may not use this file except in 9*d4514f0bSApple OSS Distributions * compliance with the License. The rights granted to you under the License 10*d4514f0bSApple OSS Distributions * may not be used to create, or enable the creation or redistribution of, 11*d4514f0bSApple OSS Distributions * unlawful or unlicensed copies of an Apple operating system, or to 12*d4514f0bSApple OSS Distributions * circumvent, violate, or enable the circumvention or violation of, any 13*d4514f0bSApple OSS Distributions * terms of an Apple operating system software license agreement. 14*d4514f0bSApple OSS Distributions * 15*d4514f0bSApple OSS Distributions * Please obtain a copy of the License at 16*d4514f0bSApple OSS Distributions * http://www.opensource.apple.com/apsl/ and read it before using this file. 17*d4514f0bSApple OSS Distributions * 18*d4514f0bSApple OSS Distributions * The Original Code and all software distributed under the License are 19*d4514f0bSApple OSS Distributions * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20*d4514f0bSApple OSS Distributions * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21*d4514f0bSApple OSS Distributions * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22*d4514f0bSApple OSS Distributions * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23*d4514f0bSApple OSS Distributions * Please see the License for the specific language governing rights and 24*d4514f0bSApple OSS Distributions * limitations under the License. 25*d4514f0bSApple OSS Distributions * 26*d4514f0bSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27*d4514f0bSApple OSS Distributions */ 28*d4514f0bSApple OSS Distributions 29*d4514f0bSApple OSS Distributions#if !__IIG 30*d4514f0bSApple OSS Distributions#if KERNEL 31*d4514f0bSApple OSS Distributions#include <IOKit/IOMemoryDescriptor.h> 32*d4514f0bSApple OSS Distributions#endif 33*d4514f0bSApple OSS Distributions#endif 34*d4514f0bSApple OSS Distributions 35*d4514f0bSApple OSS Distributions#ifndef _IOKIT_UIOMEMORYDESCRIPTOR_H 36*d4514f0bSApple OSS Distributions#define _IOKIT_UIOMEMORYDESCRIPTOR_H 37*d4514f0bSApple OSS Distributions 38*d4514f0bSApple OSS Distributions#include <DriverKit/OSObject.iig> 39*d4514f0bSApple OSS Distributions 40*d4514f0bSApple OSS Distributionsclass IOService; 41*d4514f0bSApple OSS Distributionsclass IOMemoryMap; 42*d4514f0bSApple OSS Distributions 43*d4514f0bSApple OSS Distributions 44*d4514f0bSApple OSS Distributions// IOMemoryDescriptor Create options 45*d4514f0bSApple OSS Distributionsenum { 46*d4514f0bSApple OSS Distributions kIOMemoryDirectionNone = 0x00000000, 47*d4514f0bSApple OSS Distributions kIOMemoryDirectionIn = 0x00000001, 48*d4514f0bSApple OSS Distributions kIOMemoryDirectionOut = 0x00000002, 49*d4514f0bSApple OSS Distributions kIOMemoryDirectionOutIn = kIOMemoryDirectionIn | kIOMemoryDirectionOut, 50*d4514f0bSApple OSS Distributions kIOMemoryDirectionInOut = kIOMemoryDirectionOutIn, 51*d4514f0bSApple OSS Distributions kIOMemoryDisableCopyOnWrite = 0x00000010 52*d4514f0bSApple OSS Distributions}; 53*d4514f0bSApple OSS Distributions 54*d4514f0bSApple OSS Distributions// IOMemoryDescriptor CreateMapping options 55*d4514f0bSApple OSS Distributionsenum { 56*d4514f0bSApple OSS Distributions kIOMemoryMapFixedAddress = 0x00000001, 57*d4514f0bSApple OSS Distributions kIOMemoryMapReadOnly = 0x00000002, 58*d4514f0bSApple OSS Distributions kIOMemoryMapGuardedMask = 0x0000001C, 59*d4514f0bSApple OSS Distributions kIOMemoryMapGuardedDefault = 0x00000000, 60*d4514f0bSApple OSS Distributions kIOMemoryMapGuardedNone = 0x00000004, 61*d4514f0bSApple OSS Distributions kIOMemoryMapGuardedSmall = 0x00000008, 62*d4514f0bSApple OSS Distributions kIOMemoryMapGuardedLarge = 0x0000000C, 63*d4514f0bSApple OSS Distributions kIOMemoryMapCacheModeDefault = 0x00000000, 64*d4514f0bSApple OSS Distributions kIOMemoryMapCacheModeInhibit = 0x00000100, 65*d4514f0bSApple OSS Distributions kIOMemoryMapCacheModeCopyback = 0x00000200, 66*d4514f0bSApple OSS Distributions kIOMemoryMapCacheModeWriteThrough = 0x00000400, 67*d4514f0bSApple OSS Distributions kIOMemoryMapCacheModeRealTime = 0x00000800, 68*d4514f0bSApple OSS Distributions}; 69*d4514f0bSApple OSS Distributions 70*d4514f0bSApple OSS Distributionsstruct IOAddressSegment { 71*d4514f0bSApple OSS Distributions uint64_t address; 72*d4514f0bSApple OSS Distributions uint64_t length; 73*d4514f0bSApple OSS Distributions}; 74*d4514f0bSApple OSS Distributions 75*d4514f0bSApple OSS Distributionsstruct _IOMDPrivateState { 76*d4514f0bSApple OSS Distributions uint64_t length; 77*d4514f0bSApple OSS Distributions uint64_t options; 78*d4514f0bSApple OSS Distributions}; 79*d4514f0bSApple OSS Distributions 80*d4514f0bSApple OSS Distributions/*! 81*d4514f0bSApple OSS Distributions * @class IOMemoryDescriptor 82*d4514f0bSApple OSS Distributions * 83*d4514f0bSApple OSS Distributions * @abstract 84*d4514f0bSApple OSS Distributions * IOMemoryDescriptor describes a memory buffer. 85*d4514f0bSApple OSS Distributions * 86*d4514f0bSApple OSS Distributions * @discussion 87*d4514f0bSApple OSS Distributions * To allocate memory for I/O or sharing, use IOBufferMemoryDescriptor::Create() 88*d4514f0bSApple OSS Distributions * Methods in this class are used for memory that was supplied as a parameter. 89*d4514f0bSApple OSS Distributions * 90*d4514f0bSApple OSS Distributions 91*d4514f0bSApple OSS Distributions@iig implementation 92*d4514f0bSApple OSS Distributions#include <DriverKit/IOService.h> 93*d4514f0bSApple OSS Distributions@iig end 94*d4514f0bSApple OSS Distributions*/ 95*d4514f0bSApple OSS Distributions 96*d4514f0bSApple OSS Distributionsclass KERNEL IOMemoryDescriptor : public OSObject 97*d4514f0bSApple OSS Distributions{ 98*d4514f0bSApple OSS Distributionspublic: 99*d4514f0bSApple OSS Distributions 100*d4514f0bSApple OSS Distributions 101*d4514f0bSApple OSS Distributions virtual bool 102*d4514f0bSApple OSS Distributions init() override; 103*d4514f0bSApple OSS Distributions 104*d4514f0bSApple OSS Distributions virtual void 105*d4514f0bSApple OSS Distributions free() override; 106*d4514f0bSApple OSS Distributions 107*d4514f0bSApple OSS Distributions /*! 108*d4514f0bSApple OSS Distributions * @brief Obtain the length of the memory described. 109*d4514f0bSApple OSS Distributions * @param returnLength Returned length. 110*d4514f0bSApple OSS Distributions * @return kIOReturnSuccess on success. See IOReturn.h for error codes. 111*d4514f0bSApple OSS Distributions */ 112*d4514f0bSApple OSS Distributions kern_return_t 113*d4514f0bSApple OSS Distributions GetLength( 114*d4514f0bSApple OSS Distributions uint64_t * returnLength) LOCALONLY; 115*d4514f0bSApple OSS Distributions 116*d4514f0bSApple OSS Distributions /*! 117*d4514f0bSApple OSS Distributions * @brief Create a mapping of the memory in the callers address space. 118*d4514f0bSApple OSS Distributions * @param options 119*d4514f0bSApple OSS Distributions * kIOMemoryMapFixedAddress map at the address requested 120*d4514f0bSApple OSS Distributions * kIOMemoryMapReadOnly create a read only mapping 121*d4514f0bSApple OSS Distributions * kIOMemoryMapCacheModeDefault default cache mode 122*d4514f0bSApple OSS Distributions * kIOMemoryMapCacheModeInhibit inhibited cache mode 123*d4514f0bSApple OSS Distributions * kIOMemoryMapCacheModeCopyback copyback cache mode 124*d4514f0bSApple OSS Distributions * kIOMemoryMapCacheModeWriteThrough write through cache mode 125*d4514f0bSApple OSS Distributions * @param address Requested address if kIOMemoryMapFixedAddress was passed 126*d4514f0bSApple OSS Distributions * @param offset Start offset of the mapping in the descriptor. 127*d4514f0bSApple OSS Distributions * @param length Pass zero to map the entire memory, or a value <= the length of the descriptor. 128*d4514f0bSApple OSS Distributions * @param alignment of the memory virtual mapping. Only zero for no alignment is supported. 129*d4514f0bSApple OSS Distributions * @param map Returned IOMemoryMap object with +1 retain count. 130*d4514f0bSApple OSS Distributions * It should be retained until the map is no longer required. 131*d4514f0bSApple OSS Distributions * @return kIOReturnSuccess on success. See IOReturn.h for error codes. 132*d4514f0bSApple OSS Distributions */ 133*d4514f0bSApple OSS Distributions virtual kern_return_t 134*d4514f0bSApple OSS Distributions CreateMapping( 135*d4514f0bSApple OSS Distributions uint64_t options, 136*d4514f0bSApple OSS Distributions uint64_t address, 137*d4514f0bSApple OSS Distributions uint64_t offset, 138*d4514f0bSApple OSS Distributions uint64_t length, 139*d4514f0bSApple OSS Distributions uint64_t alignment, 140*d4514f0bSApple OSS Distributions IOMemoryMap ** map); 141*d4514f0bSApple OSS Distributions 142*d4514f0bSApple OSS Distributions /*! 143*d4514f0bSApple OSS Distributions * @brief Create a memory descriptor that is a subrange of another memory 144*d4514f0bSApple OSS Distributions * descriptor 145*d4514f0bSApple OSS Distributions * @param memoryDescriptorCreateOptions 146*d4514f0bSApple OSS Distributions * kIOMemoryDirectionIn memory described will be writable 147*d4514f0bSApple OSS Distributions * kIOMemoryDirectionOut memory described will be readable 148*d4514f0bSApple OSS Distributions * @param offset Start offset of the memory relative to the descriptor ofDescriptor. 149*d4514f0bSApple OSS Distributions * @param length Length of the memory. 150*d4514f0bSApple OSS Distributions * @param ofDescriptor Memory descriptor describing source memory. 151*d4514f0bSApple OSS Distributions * @param memory Returned IOMemoryDescriptor object with +1 retain count. 152*d4514f0bSApple OSS Distributions * @return kIOReturnSuccess on success. See IOReturn.h for error codes. 153*d4514f0bSApple OSS Distributions */ 154*d4514f0bSApple OSS Distributions static kern_return_t 155*d4514f0bSApple OSS Distributions CreateSubMemoryDescriptor( 156*d4514f0bSApple OSS Distributions uint64_t memoryDescriptorCreateOptions, 157*d4514f0bSApple OSS Distributions uint64_t offset, 158*d4514f0bSApple OSS Distributions uint64_t length, 159*d4514f0bSApple OSS Distributions IOMemoryDescriptor * ofDescriptor, 160*d4514f0bSApple OSS Distributions IOMemoryDescriptor ** memory) __attribute__((availability(driverkit,introduced=20.0))); 161*d4514f0bSApple OSS Distributions 162*d4514f0bSApple OSS Distributions /*! 163*d4514f0bSApple OSS Distributions * @brief Create a memory descriptor that is a concatenation of a set of memory 164*d4514f0bSApple OSS Distributions * descriptors 165*d4514f0bSApple OSS Distributions * @param memoryDescriptorCreateOptions 166*d4514f0bSApple OSS Distributions * kIOMemoryDirectionIn memory described will be writable. The source 167*d4514f0bSApple OSS Distributions * descriptors must include this direction. 168*d4514f0bSApple OSS Distributions * kIOMemoryDirectionOut memory described will be readable. The source 169*d4514f0bSApple OSS Distributions * descriptors must include this direction. 170*d4514f0bSApple OSS Distributions * @param withDescriptorsCount Number of valid memory descriptors being passed 171*d4514f0bSApple OSS Distributions * in the withDescriptors array. 172*d4514f0bSApple OSS Distributions * @param withDescriptors Source memory descriptor array. 173*d4514f0bSApple OSS Distributions * @param memory Returned IOMemoryDescriptor object with +1 retain count. 174*d4514f0bSApple OSS Distributions * @return kIOReturnSuccess on success. See IOReturn.h for error codes. 175*d4514f0bSApple OSS Distributions */ 176*d4514f0bSApple OSS Distributions static kern_return_t 177*d4514f0bSApple OSS Distributions CreateWithMemoryDescriptors( 178*d4514f0bSApple OSS Distributions uint64_t memoryDescriptorCreateOptions, 179*d4514f0bSApple OSS Distributions uint32_t withDescriptorsCount, 180*d4514f0bSApple OSS Distributions IOMemoryDescriptor * const withDescriptors[32], 181*d4514f0bSApple OSS Distributions IOMemoryDescriptor ** memory) __attribute__((availability(driverkit,introduced=20.0))); 182*d4514f0bSApple OSS Distributions 183*d4514f0bSApple OSS Distributionsprivate: 184*d4514f0bSApple OSS Distributions kern_return_t 185*d4514f0bSApple OSS Distributions Map( 186*d4514f0bSApple OSS Distributions uint64_t options, 187*d4514f0bSApple OSS Distributions uint64_t address, 188*d4514f0bSApple OSS Distributions uint64_t length, 189*d4514f0bSApple OSS Distributions uint64_t alignment, 190*d4514f0bSApple OSS Distributions 191*d4514f0bSApple OSS Distributions uint64_t * returnAddress, 192*d4514f0bSApple OSS Distributions uint64_t * returnLength) LOCALONLY; 193*d4514f0bSApple OSS Distributions}; 194*d4514f0bSApple OSS Distributions 195*d4514f0bSApple OSS Distributionsclass EXTENDS (IOMemoryDescriptor) IOMemoryDescriptorPrivate 196*d4514f0bSApple OSS Distributions{ 197*d4514f0bSApple OSS Distributions virtual kern_return_t 198*d4514f0bSApple OSS Distributions _CopyState( 199*d4514f0bSApple OSS Distributions _IOMDPrivateState * state); 200*d4514f0bSApple OSS Distributions}; 201*d4514f0bSApple OSS Distributions 202*d4514f0bSApple OSS Distributions 203*d4514f0bSApple OSS Distributions 204*d4514f0bSApple OSS Distributions#endif /* ! _IOKIT_UIOMEMORYDESCRIPTOR_H */ 205