xref: /xnu-11215.81.4/iokit/Kernel/IOServicePrivate.h (revision d4514f0bc1d3f944c22d92e68b646ac3fb40d452)
1 /*
2  * Copyright (c) 1998-2019 Apple Inc. All rights reserved.
3  *
4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5  *
6  * This file contains Original Code and/or Modifications of Original Code
7  * as defined in and that are subject to the Apple Public Source License
8  * Version 2.0 (the 'License'). You may not use this file except in
9  * compliance with the License. The rights granted to you under the License
10  * may not be used to create, or enable the creation or redistribution of,
11  * unlawful or unlicensed copies of an Apple operating system, or to
12  * circumvent, violate, or enable the circumvention or violation of, any
13  * terms of an Apple operating system software license agreement.
14  *
15  * Please obtain a copy of the License at
16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17  *
18  * The Original Code and all software distributed under the License are
19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23  * Please see the License for the specific language governing rights and
24  * limitations under the License.
25  *
26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27  */
28 /*
29  * Copyright (c) 1999 Apple Computer, Inc.  All rights reserved.
30  *
31  * HISTORY
32  *
33  */
34 
35 
36 #ifndef _IOKIT_IOSERVICEPRIVATE_H
37 #define _IOKIT_IOSERVICEPRIVATE_H
38 
39 // options for getExistingServices()
40 enum {
41 	kIONotifyOnce             = 0x00000001,
42 	kIOServiceExistingSet     = 0x00000002,
43 	kIOServiceChangesOK       = 0x00000004,
44 	kIOServiceInternalDone    = 0x00000008,
45 	kIOServiceClassDone       = 0x00000010,
46 };
47 
48 // masks for __state[1]
49 enum {
50 	kIOServiceBusyStateMask     = 0x000003ff,
51 	kIOServiceBusyMax           = 1023,
52 	kIOServiceNeedConfigState   = 0x80000000,
53 	kIOServiceSynchronousState  = 0x40000000,
54 	kIOServiceModuleStallState  = 0x20000000,
55 	kIOServiceBusyWaiterState   = 0x10000000,
56 
57 	kIOServiceSyncPubState      = 0x08000000,
58 	kIOServiceConfigState       = 0x04000000,
59 	kIOServiceStartState        = 0x02000000,
60 	kIOServiceTermPhase2State   = 0x01000000,
61 	kIOServiceTermPhase3State   = 0x00800000,
62 	kIOServiceTermPhase1State   = 0x00400000,
63 	kIOServiceTerm1WaiterState  = 0x00200000,
64 	kIOServiceRecursing         = 0x00100000,
65 	kIOServiceNeedWillTerminate = 0x00080000,
66 	kIOServiceWaitDetachState   = 0x00040000,
67 	kIOServiceConfigRunning     = 0x00020000,
68 	kIOServiceFinalized         = 0x00010000,
69 
70 	kIOServiceRematchOnDetach   = 0x00008000,
71 	kIOServiceUserUnhidden      = 0x00004000,
72 //	kIOServiceX1                = 0x00004000,
73 //	kIOServiceX2                = 0x00002000,
74 //	kIOServiceX3                = 0x00001000,
75 //	kIOServiceX4                = 0x00000800,
76 //	kIOServiceX5                = 0x00000400,
77 };
78 
79 extern const OSSymbol * gIOServiceNotificationUserKey;
80 
81 
82 // notify state
83 enum {
84 	kIOServiceNotifyEnable      = 0x00000001,
85 	kIOServiceNotifyWaiter      = 0x00000002,
86 	kIOServiceNotifyBlock       = 0x00000004
87 };
88 
89 struct _IOServiceNotifierInvocation {
90 	IOThread            thread;
91 	queue_chain_t       link;
92 };
93 
94 class _IOServiceNotifier : public IONotifier
95 {
96 	friend class IOService;
97 
98 	OSDeclareDefaultStructors(_IOServiceNotifier);
99 
100 public:
101 	OSOrderedSet *                      whence;
102 
103 	OSDictionary *                      matching;
104 	const OSSymbol *                    type;
105 	IOServiceMatchingNotificationHandler handler;
106 	IOServiceNotificationHandler        compatHandler;
107 	void *                              target;
108 	void *                              ref;
109 	SInt32                              priority;
110 	queue_head_t                        handlerInvocations;
111 	IOOptionBits                        state;
112 
113 	virtual void free() APPLE_KEXT_OVERRIDE;
114 	virtual void remove() APPLE_KEXT_OVERRIDE;
115 	virtual bool disable() APPLE_KEXT_OVERRIDE;
116 	virtual void enable( bool was ) APPLE_KEXT_OVERRIDE;
117 	virtual void wait();
118 };
119 
120 class _IOServiceInterestNotifier : public IONotifier
121 {
122 	friend class IOService;
123 
124 	OSDeclareDefaultStructors(_IOServiceInterestNotifier);
125 
126 public:
127 	queue_chain_t               chain;
128 
129 	IOServiceInterestHandler    handler;
130 	void *                      target;
131 	void *                      ref;
132 	queue_head_t                handlerInvocations;
133 	IOOptionBits                state;
134 
135 	virtual void free() APPLE_KEXT_OVERRIDE;
136 	virtual void remove() APPLE_KEXT_OVERRIDE;
137 	virtual bool disable() APPLE_KEXT_OVERRIDE;
138 	virtual void enable( bool was ) APPLE_KEXT_OVERRIDE;
139 	virtual void wait();
140 	virtual bool init() APPLE_KEXT_OVERRIDE;
141 };
142 
143 class _IOServiceNullNotifier : public IONotifier
144 {
145 	OSDeclareDefaultStructors(_IOServiceNullNotifier);
146 
147 public:
148 	virtual void taggedRetain(const void *tag) const APPLE_KEXT_OVERRIDE;
149 	virtual void taggedRelease(const void *tag, const int when) const APPLE_KEXT_OVERRIDE;
150 	virtual void free() APPLE_KEXT_OVERRIDE;
151 	virtual void remove() APPLE_KEXT_OVERRIDE;
152 	virtual bool disable() APPLE_KEXT_OVERRIDE;
153 	virtual void enable( bool was ) APPLE_KEXT_OVERRIDE;
154 	virtual void wait();
155 };
156 
157 class _IOConfigThread : public OSObject
158 {
159 	friend class IOService;
160 
161 	OSDeclareDefaultStructors(_IOConfigThread);
162 
163 public:
164 	static void configThread( const char * name );
165 	static void main( void * arg, wait_result_t result );
166 };
167 
168 enum {
169 	kMaxConfigThreads       = CONFIG_MAX_THREADS,
170 };
171 
172 enum {
173 	kMatchNubJob        = 10,
174 };
175 
176 class _IOServiceJob : public OSObject
177 {
178 	friend class IOService;
179 
180 	OSDeclareDefaultStructors(_IOServiceJob);
181 
182 public:
183 	int                 type;
184 	IOService *         nub;
185 	IOOptionBits        options;
186 
187 	static LIBKERN_RETURNS_NOT_RETAINED _IOServiceJob * startJob( IOService * nub, int type,
188 	    IOOptionBits options = 0 );
189 	static void pingConfig( LIBKERN_CONSUMED class _IOServiceJob * job );
190 };
191 
192 class IOResources : public IOService
193 {
194 	friend class IOService;
195 
196 	OSDeclareDefaultStructors(IOResources);
197 
198 public:
199 	static IOService * resources( void );
200 	virtual bool init( OSDictionary * dictionary = NULL ) APPLE_KEXT_OVERRIDE;
201 	virtual IOReturn newUserClient(task_t owningTask, void * securityID,
202 	    UInt32 type, OSDictionary * properties,
203 	    IOUserClient ** handler) APPLE_KEXT_OVERRIDE;
204 	virtual IOWorkLoop * getWorkLoop() const APPLE_KEXT_OVERRIDE;
205 	virtual bool matchPropertyTable( OSDictionary * table ) APPLE_KEXT_OVERRIDE;
206 	virtual IOReturn setProperties( OSObject * properties ) APPLE_KEXT_OVERRIDE;
207 };
208 
209 class IOUserResources : public IOService
210 {
211 	friend class IOService;
212 
213 	OSDeclareDefaultStructors(IOUserResources);
214 
215 public:
216 	static IOService * resources( void );
217 	virtual bool init( OSDictionary * dictionary = NULL ) APPLE_KEXT_OVERRIDE;
218 	virtual IOReturn newUserClient(task_t owningTask, void * securityID,
219 	    UInt32 type, OSDictionary * properties,
220 	    IOUserClient ** handler) APPLE_KEXT_OVERRIDE;
221 	virtual IOWorkLoop * getWorkLoop() const APPLE_KEXT_OVERRIDE;
222 	virtual bool matchPropertyTable( OSDictionary * table ) APPLE_KEXT_OVERRIDE;
223 };
224 
225 class _IOOpenServiceIterator : public OSIterator
226 {
227 	friend class IOService;
228 
229 	OSDeclareDefaultStructors(_IOOpenServiceIterator);
230 
231 	OSIterator *        iter;
232 	const IOService *   client;
233 	const IOService *   provider;
234 	IOService *         last;
235 
236 public:
237 	static OSIterator * iterator(LIBKERN_CONSUMED OSIterator * _iter,
238 	    const IOService * client,
239 	    const IOService * provider );
240 	virtual void free() APPLE_KEXT_OVERRIDE;
241 	virtual void reset() APPLE_KEXT_OVERRIDE;
242 	virtual bool isValid() APPLE_KEXT_OVERRIDE;
243 	virtual OSObject * getNextObject() APPLE_KEXT_OVERRIDE;
244 };
245 
246 class IOExclaveProxy : public IOService
247 {
248 	OSDeclareDefaultStructors(IOExclaveProxy);
249 
250 	IOExclaveProxyState * exclaveState;
251 
252 	bool start(IOService * provider) APPLE_KEXT_OVERRIDE;
253 };
254 
255 class _IOServiceStateNotification : public IOService
256 {
257 	friend class IOService;
258 
259 	IOLock * fLock;
260 	OSDictionary * fItems;
261 
262 	OSDeclareDefaultStructors(_IOServiceStateNotification);
263 
264 public:
265 };
266 
267 
268 
269 extern const OSSymbol * gIOConsoleUsersKey;
270 extern const OSSymbol * gIOConsoleSessionUIDKey;
271 extern const OSSymbol * gIOConsoleSessionAuditIDKey;
272 extern const OSSymbol * gIOConsoleSessionOnConsoleKey;
273 extern const OSSymbol * gIOConsoleSessionSecureInputPIDKey;
274 
275 #endif /* ! _IOKIT_IOSERVICEPRIVATE_H */
276