1 | /* iig(DriverKit-286) generated from OSAction.iig */ |
2 | |
3 | /* OSAction.iig:1-38 */ |
4 | /* |
5 | * Copyright (c) 2019-2019 Apple Inc. All rights reserved. |
6 | * |
7 | * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ |
8 | * |
9 | * This file contains Original Code and/or Modifications of Original Code |
10 | * as defined in and that are subject to the Apple Public Source License |
11 | * Version 2.0 (the 'License'). You may not use this file except in |
12 | * compliance with the License. The rights granted to you under the License |
13 | * may not be used to create, or enable the creation or redistribution of, |
14 | * unlawful or unlicensed copies of an Apple operating system, or to |
15 | * circumvent, violate, or enable the circumvention or violation of, any |
16 | * terms of an Apple operating system software license agreement. |
17 | * |
18 | * Please obtain a copy of the License at |
19 | * http://www.opensource.apple.com/apsl/ and read it before using this file. |
20 | * |
21 | * The Original Code and all software distributed under the License are |
22 | * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER |
23 | * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, |
24 | * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, |
25 | * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. |
26 | * Please see the License for the specific language governing rights and |
27 | * limitations under the License. |
28 | * |
29 | * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ |
30 | */ |
31 | |
32 | #ifndef _IOKIT_OSACTION_H |
33 | #define _IOKIT_OSACTION_H |
34 | |
35 | #include <DriverKit/OSObject.h> /* .iig include */ |
36 | |
37 | typedef void (^OSActionCancelHandler)(void); |
38 | typedef void (^OSActionAbortedHandler)(void); |
39 | struct OSActionWaitToken; |
40 | class OSString; |
41 | |
42 | /* source class OSAction OSAction.iig:39-170 */ |
43 | |
44 | #if __DOCUMENTATION__ |
45 | #define KERNEL IIG_KERNEL |
46 | |
47 | /*! |
48 | * @class OSAction |
49 | * |
50 | * @abstract |
51 | * OSAction is an object that represents a callback to be be invoked. |
52 | * |
53 | * @discussion |
54 | * The callback is specified as a method and object pair. |
55 | * State associated with the callback may be allocated and stored for the creator of the object. |
56 | * Methods to allocate an OSAction instance are generated for each method defined in a class with |
57 | * a TYPE attribute. The generated methods are named CreateAction{name of method with type attribute} |
58 | * and have the following declaration: |
59 | * |
60 | * kern_return_t CreateActionNameOfMethod(size_t referenceSize, OSAction **action); |
61 | * |
62 | * referenceSize refers to the size of additional state structure available to the creator of the OSAction |
63 | * with GetReference. If successful, the generated method returns kIOReturnSuccess and a created OSAction |
64 | * through the 'action' parameter with a +1 retain count to be released by the caller. See IOReturn.h for |
65 | * error codes. |
66 | */ |
67 | |
68 | class NATIVE KERNEL OSAction : public OSObject |
69 | { |
70 | public: |
71 | |
72 | #if DRIVERKIT_PRIVATE |
73 | /*! |
74 | * @brief Create an instance of OSAction. |
75 | * @discussion Methods to allocate an OSAction instance are generated for each method defined in a class with |
76 | * a TYPE attribute, so there should not be any need to directly call OSAction::Create(). |
77 | * @param target OSObject to receive the callback. This object will be retained until the OSAction is |
78 | * canceled or freed. |
79 | * @param targetmsgid Generated message ID for the target method. |
80 | * @param msgid Generated message ID for the method invoked by the receiver of the OSAction |
81 | * to generate the callback. |
82 | * @param referenceSize Size of additional state structure available to the creator of the OSAction |
83 | * with GetReference. |
84 | * @param action Created OSAction with +1 retain count to be released by the caller. |
85 | * @return kIOReturnSuccess on success. See IOReturn.h for error codes. |
86 | */ |
87 | static kern_return_t |
88 | Create( |
89 | OSObject * target, |
90 | uint64_t targetmsgid, |
91 | uint64_t msgid, |
92 | size_t referenceSize, |
93 | OSAction ** action) LOCAL; |
94 | |
95 | static kern_return_t |
96 | CreateWithTypeName( |
97 | OSObject * target, |
98 | uint64_t targetmsgid, |
99 | uint64_t msgid, |
100 | size_t referenceSize, |
101 | OSString * typeName, |
102 | OSAction ** action) LOCAL; |
103 | #endif |
104 | |
105 | virtual void |
106 | free() override; |
107 | |
108 | /*! |
109 | * @brief Return a pointer to any state allocated by the OSAction creator. |
110 | * @discussion Reference data is allocated with zero initialized content. It may be set and retrieved later |
111 | * with this method. |
112 | * @return A pointer to storage for the owner. It will be NULL if referenceSize was zero, and NULL |
113 | * when called in a process other than the owner that is receiving the OSAction as a parameter. |
114 | */ |
115 | void * |
116 | GetReference() LOCALONLY; |
117 | |
118 | /*! |
119 | * @brief Cancel all callbacks from the action. |
120 | * @discussion After cancellation, the action can only be freed. It cannot be reactivated. |
121 | * @param handler Handler block to be invoked after any callbacks have completed. |
122 | * @return kIOReturnSuccess on success. See IOReturn.h for error codes. |
123 | */ |
124 | kern_return_t |
125 | Cancel(OSActionCancelHandler handler) LOCALONLY; |
126 | |
127 | /*! |
128 | * @brief Install a handler to be invoked when no other processes reference the action. |
129 | * @discussion When all tasks other than the creator release their references to the action, |
130 | * invoke the handler in the owner. A task exiting will always remove its references. |
131 | * @param handler Handler block to be invoked on no more references. |
132 | * @return kIOReturnSuccess on success. See IOReturn.h for error codes. |
133 | */ |
134 | kern_return_t |
135 | SetAbortedHandler(OSActionAbortedHandler handler) LOCALONLY; |
136 | |
137 | /*! |
138 | * @brief Mark this OSAction to be waited for later with Wait(). |
139 | * @discussion This call should be made before any possible invocation of the action. |
140 | * An OSAction instance only supports one waiter and WillWait() will return an error if already called. |
141 | * @param token Opaque value to be passed to a later call to Wait() and EndWait(). |
142 | * @return kIOReturnSuccess on success. See IOReturn.h for error codes. |
143 | */ |
144 | kern_return_t |
145 | WillWait(OSActionWaitToken ** token) LOCALONLY; |
146 | |
147 | /*! |
148 | * @brief Discard the OSActionWaitToken for the action. |
149 | * @discussion Free any resources needed to wait for the action allocated by WillWait(). |
150 | * There should be no outstanding invocations of the action when EndWait is called, |
151 | * if necessary the action should be canceled before calling EndWait(). |
152 | * @param token Opaque value to be passed from an earlier call to WillWait(). |
153 | * @return kIOReturnSuccess on success. kIOReturnAborted if aborted or canceled. |
154 | kIOReturnTimeout if the deadline was passed. See IOReturn.h for error codes. |
155 | */ |
156 | kern_return_t |
157 | EndWait( |
158 | OSActionWaitToken * token) LOCALONLY; |
159 | |
160 | /*! |
161 | * @brief Wait for the action to be invoked. |
162 | * @discussion The current thread is blocked until the action invocation has completed, the action canceled |
163 | or aborted, or the deadline passed. |
164 | * @param token Opaque value to be passed from an earlier call to WillWait(). |
165 | * @param options Pass one of the kIOTimerClock* options to specify the timebase for the |
166 | * deadline, or zero for no timeout. |
167 | * @param deadline Pass the time the wait should timeout, or zero for no timeout. |
168 | * @return kIOReturnSuccess on success. kIOReturnAborted if aborted or canceled. |
169 | kIOReturnTimeout if the deadline was passed. See IOReturn.h for error codes. |
170 | */ |
171 | kern_return_t |
172 | Wait( |
173 | OSActionWaitToken * token, |
174 | uint64_t options, |
175 | uint64_t deadline) LOCALONLY; |
176 | |
177 | virtual void |
178 | Aborted(void) LOCALHOST; |
179 | }; |
180 | |
181 | #undef KERNEL |
182 | #else /* __DOCUMENTATION__ */ |
183 | |
184 | /* generated class OSAction OSAction.iig:39-170 */ |
185 | |
186 | #define OSAction_Create_ID 0xaa1fc3ce85ce5497ULL |
187 | #define OSAction_CreateWithTypeName_ID 0xa0c5b3ed5a8ea283ULL |
188 | #define OSAction_Aborted_ID 0xbfb95094c657d68fULL |
189 | |
190 | #define OSAction_Create_Args \ |
191 | OSObject * target, \ |
192 | uint64_t targetmsgid, \ |
193 | uint64_t msgid, \ |
194 | size_t referenceSize, \ |
195 | OSAction ** action |
196 | |
197 | #define OSAction_CreateWithTypeName_Args \ |
198 | OSObject * target, \ |
199 | uint64_t targetmsgid, \ |
200 | uint64_t msgid, \ |
201 | size_t referenceSize, \ |
202 | OSString * typeName, \ |
203 | OSAction ** action |
204 | |
205 | #define OSAction_Aborted_Args \ |
206 | |
207 | |
208 | #define OSAction_Methods \ |
209 | \ |
210 | public:\ |
211 | \ |
212 | virtual kern_return_t\ |
213 | Dispatch(const IORPC rpc) APPLE_KEXT_OVERRIDE;\ |
214 | \ |
215 | static kern_return_t\ |
216 | _Dispatch(OSAction * self, const IORPC rpc);\ |
217 | \ |
218 | static kern_return_t\ |
219 | Create(\ |
220 | OSObject * target,\ |
221 | uint64_t targetmsgid,\ |
222 | uint64_t msgid,\ |
223 | size_t referenceSize,\ |
224 | OSAction ** action);\ |
225 | \ |
226 | static kern_return_t\ |
227 | CreateWithTypeName(\ |
228 | OSObject * target,\ |
229 | uint64_t targetmsgid,\ |
230 | uint64_t msgid,\ |
231 | size_t referenceSize,\ |
232 | OSString * typeName,\ |
233 | OSAction ** action);\ |
234 | \ |
235 | void *\ |
236 | GetReference(\ |
237 | );\ |
238 | \ |
239 | kern_return_t\ |
240 | Cancel(\ |
241 | OSActionCancelHandler handler);\ |
242 | \ |
243 | kern_return_t\ |
244 | SetAbortedHandler(\ |
245 | OSActionAbortedHandler handler);\ |
246 | \ |
247 | kern_return_t\ |
248 | WillWait(\ |
249 | OSActionWaitToken ** token);\ |
250 | \ |
251 | kern_return_t\ |
252 | EndWait(\ |
253 | OSActionWaitToken * token);\ |
254 | \ |
255 | kern_return_t\ |
256 | Wait(\ |
257 | OSActionWaitToken * token,\ |
258 | uint64_t options,\ |
259 | uint64_t deadline);\ |
260 | \ |
261 | void\ |
262 | Aborted(\ |
263 | OSDispatchMethod supermethod = NULL);\ |
264 | \ |
265 | \ |
266 | protected:\ |
267 | /* _Impl methods */\ |
268 | \ |
269 | static kern_return_t\ |
270 | Create_Call(OSAction_Create_Args);\ |
271 | \ |
272 | static kern_return_t\ |
273 | CreateWithTypeName_Call(OSAction_CreateWithTypeName_Args);\ |
274 | \ |
275 | void\ |
276 | Aborted_Impl(OSAction_Aborted_Args);\ |
277 | \ |
278 | \ |
279 | public:\ |
280 | /* _Invoke methods */\ |
281 | \ |
282 | typedef kern_return_t (*Create_Handler)(OSAction_Create_Args);\ |
283 | static kern_return_t\ |
284 | Create_Invoke(const IORPC rpc,\ |
285 | Create_Handler func);\ |
286 | \ |
287 | typedef kern_return_t (*CreateWithTypeName_Handler)(OSAction_CreateWithTypeName_Args);\ |
288 | static kern_return_t\ |
289 | CreateWithTypeName_Invoke(const IORPC rpc,\ |
290 | CreateWithTypeName_Handler func);\ |
291 | \ |
292 | typedef void (*Aborted_Handler)(OSMetaClassBase * targetOSAction_Aborted_Args);\ |
293 | static kern_return_t\ |
294 | Aborted_Invoke(const IORPC rpc,\ |
295 | OSMetaClassBase * target,\ |
296 | Aborted_Handler func);\ |
297 | \ |
298 | |
299 | |
300 | #define OSAction_KernelMethods \ |
301 | \ |
302 | protected:\ |
303 | /* _Impl methods */\ |
304 | \ |
305 | static kern_return_t\ |
306 | Create_Impl(OSAction_Create_Args);\ |
307 | \ |
308 | static kern_return_t\ |
309 | CreateWithTypeName_Impl(OSAction_CreateWithTypeName_Args);\ |
310 | \ |
311 | |
312 | |
313 | #define OSAction_VirtualMethods \ |
314 | \ |
315 | public:\ |
316 | \ |
317 | virtual void\ |
318 | free(\ |
319 | ) APPLE_KEXT_OVERRIDE;\ |
320 | \ |
321 | |
322 | |
323 | #if !KERNEL |
324 | |
325 | extern OSMetaClass * gOSActionMetaClass; |
326 | extern const OSClassLoadInformation OSAction_Class; |
327 | |
328 | class OSActionMetaClass : public OSMetaClass |
329 | { |
330 | public: |
331 | virtual kern_return_t |
332 | New(OSObject * instance) override; |
333 | virtual kern_return_t |
334 | Dispatch(const IORPC rpc) override; |
335 | }; |
336 | |
337 | #endif /* !KERNEL */ |
338 | |
339 | class OSActionInterface : public OSInterface |
340 | { |
341 | public: |
342 | }; |
343 | |
344 | struct OSAction_IVars; |
345 | struct OSAction_LocalIVars; |
346 | |
347 | class OSAction : public OSObject, public OSActionInterface |
348 | { |
349 | #if KERNEL |
350 | OSDeclareDefaultStructorsWithDispatch(OSAction); |
351 | #endif /* KERNEL */ |
352 | |
353 | #if !KERNEL |
354 | friend class OSActionMetaClass; |
355 | #endif /* !KERNEL */ |
356 | |
357 | public: |
358 | #ifdef OSAction_DECLARE_IVARS |
359 | OSAction_DECLARE_IVARS |
360 | #else /* OSAction_DECLARE_IVARS */ |
361 | union |
362 | { |
363 | OSAction_IVars * ivars; |
364 | OSAction_LocalIVars * lvars; |
365 | }; |
366 | #endif /* OSAction_DECLARE_IVARS */ |
367 | #if !KERNEL |
368 | static OSMetaClass * |
369 | sGetMetaClass() { return gOSActionMetaClass; }; |
370 | virtual const OSMetaClass * |
371 | getMetaClass() const APPLE_KEXT_OVERRIDE { return gOSActionMetaClass; }; |
372 | #endif /* KERNEL */ |
373 | |
374 | using super = OSObject; |
375 | |
376 | #if !KERNEL |
377 | OSAction_Methods |
378 | #endif /* !KERNEL */ |
379 | |
380 | OSAction_VirtualMethods |
381 | }; |
382 | |
383 | #endif /* !__DOCUMENTATION__ */ |
384 | |
385 | /* OSAction.iig:172- */ |
386 | |
387 | #endif /* ! _IOKIT_OSACTION_H */ |
388 | |