xref: /xnu-11215.81.4/iokit/DriverKit/IOMemoryDescriptor.iig (revision d4514f0bc1d3f944c22d92e68b646ac3fb40d452)
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