xref: /xnu-12377.81.4/iokit/Kernel/RootDomainUserClient.cpp (revision 043036a2b3718f7f0be807e2870f8f47d3fa0796)
1*043036a2SApple OSS Distributions /*
2*043036a2SApple OSS Distributions  * Copyright (c) 1998-2020 Apple Computer, Inc. All rights reserved.
3*043036a2SApple OSS Distributions  *
4*043036a2SApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5*043036a2SApple OSS Distributions  *
6*043036a2SApple OSS Distributions  * This file contains Original Code and/or Modifications of Original Code
7*043036a2SApple OSS Distributions  * as defined in and that are subject to the Apple Public Source License
8*043036a2SApple OSS Distributions  * Version 2.0 (the 'License'). You may not use this file except in
9*043036a2SApple OSS Distributions  * compliance with the License. The rights granted to you under the License
10*043036a2SApple OSS Distributions  * may not be used to create, or enable the creation or redistribution of,
11*043036a2SApple OSS Distributions  * unlawful or unlicensed copies of an Apple operating system, or to
12*043036a2SApple OSS Distributions  * circumvent, violate, or enable the circumvention or violation of, any
13*043036a2SApple OSS Distributions  * terms of an Apple operating system software license agreement.
14*043036a2SApple OSS Distributions  *
15*043036a2SApple OSS Distributions  * Please obtain a copy of the License at
16*043036a2SApple OSS Distributions  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17*043036a2SApple OSS Distributions  *
18*043036a2SApple OSS Distributions  * The Original Code and all software distributed under the License are
19*043036a2SApple OSS Distributions  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20*043036a2SApple OSS Distributions  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21*043036a2SApple OSS Distributions  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22*043036a2SApple OSS Distributions  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23*043036a2SApple OSS Distributions  * Please see the License for the specific language governing rights and
24*043036a2SApple OSS Distributions  * limitations under the License.
25*043036a2SApple OSS Distributions  *
26*043036a2SApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27*043036a2SApple OSS Distributions  */
28*043036a2SApple OSS Distributions /*
29*043036a2SApple OSS Distributions  * Copyright (c) 1999 Apple Computer, Inc.  All rights reserved.
30*043036a2SApple OSS Distributions  *
31*043036a2SApple OSS Distributions  */
32*043036a2SApple OSS Distributions 
33*043036a2SApple OSS Distributions #include <IOKit/assert.h>
34*043036a2SApple OSS Distributions #include <IOKit/IOLib.h>
35*043036a2SApple OSS Distributions #include <IOKit/IOKitKeys.h>
36*043036a2SApple OSS Distributions #include <IOKit/IOBufferMemoryDescriptor.h>
37*043036a2SApple OSS Distributions #include "RootDomainUserClient.h"
38*043036a2SApple OSS Distributions #include <IOKit/pwr_mgt/IOPMLibDefs.h>
39*043036a2SApple OSS Distributions #include <IOKit/pwr_mgt/IOPMPrivate.h>
40*043036a2SApple OSS Distributions #include <sys/proc.h>
41*043036a2SApple OSS Distributions 
42*043036a2SApple OSS Distributions #define super IOUserClient2022
43*043036a2SApple OSS Distributions 
44*043036a2SApple OSS Distributions /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
45*043036a2SApple OSS Distributions 
OSDefineMetaClassAndStructors(RootDomainUserClient,IOUserClient2022)46*043036a2SApple OSS Distributions OSDefineMetaClassAndStructors(RootDomainUserClient, IOUserClient2022)
47*043036a2SApple OSS Distributions 
48*043036a2SApple OSS Distributions /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
49*043036a2SApple OSS Distributions 
50*043036a2SApple OSS Distributions bool
51*043036a2SApple OSS Distributions RootDomainUserClient::initWithTask(task_t owningTask, void *security_id,
52*043036a2SApple OSS Distributions     UInt32 type, OSDictionary * properties)
53*043036a2SApple OSS Distributions {
54*043036a2SApple OSS Distributions 	if (properties) {
55*043036a2SApple OSS Distributions 		properties->setObject(kIOUserClientCrossEndianCompatibleKey, kOSBooleanTrue);
56*043036a2SApple OSS Distributions 	}
57*043036a2SApple OSS Distributions 
58*043036a2SApple OSS Distributions 	if (!super::initWithTask(owningTask, security_id, type, properties)) {
59*043036a2SApple OSS Distributions 		return false;
60*043036a2SApple OSS Distributions 	}
61*043036a2SApple OSS Distributions 
62*043036a2SApple OSS Distributions 	fOwningTask = owningTask;
63*043036a2SApple OSS Distributions 	task_reference(fOwningTask);
64*043036a2SApple OSS Distributions 	return true;
65*043036a2SApple OSS Distributions }
66*043036a2SApple OSS Distributions 
67*043036a2SApple OSS Distributions 
68*043036a2SApple OSS Distributions bool
start(IOService * provider)69*043036a2SApple OSS Distributions RootDomainUserClient::start( IOService * provider )
70*043036a2SApple OSS Distributions {
71*043036a2SApple OSS Distributions 	assert(OSDynamicCast(IOPMrootDomain, provider));
72*043036a2SApple OSS Distributions 	if (!super::start(provider)) {
73*043036a2SApple OSS Distributions 		return false;
74*043036a2SApple OSS Distributions 	}
75*043036a2SApple OSS Distributions 	fOwner = (IOPMrootDomain *)provider;
76*043036a2SApple OSS Distributions 
77*043036a2SApple OSS Distributions 	setProperty(kIOUserClientDefaultLockingKey, kOSBooleanTrue);
78*043036a2SApple OSS Distributions 	setProperty(kIOUserClientDefaultLockingSetPropertiesKey, kOSBooleanTrue);
79*043036a2SApple OSS Distributions 	setProperty(kIOUserClientDefaultLockingSingleThreadExternalMethodKey, kOSBooleanFalse);
80*043036a2SApple OSS Distributions 
81*043036a2SApple OSS Distributions 	setProperty(kIOUserClientEntitlementsKey, kOSBooleanFalse);
82*043036a2SApple OSS Distributions 
83*043036a2SApple OSS Distributions 	return true;
84*043036a2SApple OSS Distributions }
85*043036a2SApple OSS Distributions 
86*043036a2SApple OSS Distributions IOReturn
secureSleepSystem(uint32_t * return_code)87*043036a2SApple OSS Distributions RootDomainUserClient::secureSleepSystem( uint32_t *return_code )
88*043036a2SApple OSS Distributions {
89*043036a2SApple OSS Distributions 	return secureSleepSystemOptions(NULL, 0, return_code);
90*043036a2SApple OSS Distributions }
91*043036a2SApple OSS Distributions 
92*043036a2SApple OSS Distributions IOReturn
secureSleepSystemOptions(const void * inOptions,IOByteCount inOptionsSize,uint32_t * returnCode)93*043036a2SApple OSS Distributions RootDomainUserClient::secureSleepSystemOptions(
94*043036a2SApple OSS Distributions 	const void      *inOptions,
95*043036a2SApple OSS Distributions 	IOByteCount     inOptionsSize,
96*043036a2SApple OSS Distributions 	uint32_t        *returnCode)
97*043036a2SApple OSS Distributions {
98*043036a2SApple OSS Distributions 	int             local_priv = 0;
99*043036a2SApple OSS Distributions 	int             admin_priv = 0;
100*043036a2SApple OSS Distributions 	IOReturn        ret = kIOReturnNotPrivileged;
101*043036a2SApple OSS Distributions 
102*043036a2SApple OSS Distributions 	ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeLocalUser);
103*043036a2SApple OSS Distributions 	local_priv = (kIOReturnSuccess == ret);
104*043036a2SApple OSS Distributions 
105*043036a2SApple OSS Distributions 	ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
106*043036a2SApple OSS Distributions 	admin_priv = (kIOReturnSuccess == ret);
107*043036a2SApple OSS Distributions 
108*043036a2SApple OSS Distributions 	if ((local_priv || admin_priv) && fOwner) {
109*043036a2SApple OSS Distributions 		OSString        *unserializeErrorString = NULL;
110*043036a2SApple OSS Distributions 		OSObject        *unserializedObject = NULL;
111*043036a2SApple OSS Distributions 		OSDictionary    *sleepOptionsDict = NULL; // do not release
112*043036a2SApple OSS Distributions 
113*043036a2SApple OSS Distributions 		proc_t p;
114*043036a2SApple OSS Distributions 		p = (proc_t)get_bsdtask_info(fOwningTask);
115*043036a2SApple OSS Distributions 		if (p) {
116*043036a2SApple OSS Distributions 			fOwner->setProperty("SleepRequestedByPID", proc_pid(p), 32);
117*043036a2SApple OSS Distributions 		}
118*043036a2SApple OSS Distributions 
119*043036a2SApple OSS Distributions 		if (inOptions) {
120*043036a2SApple OSS Distributions 			unserializedObject = OSUnserializeXML((const char *)inOptions, inOptionsSize, &unserializeErrorString);
121*043036a2SApple OSS Distributions 			sleepOptionsDict = OSDynamicCast( OSDictionary, unserializedObject);
122*043036a2SApple OSS Distributions 			if (!sleepOptionsDict) {
123*043036a2SApple OSS Distributions 				IOLog("IOPMRootDomain SleepSystem unserialization failure: %s\n",
124*043036a2SApple OSS Distributions 				    unserializeErrorString ? unserializeErrorString->getCStringNoCopy() : "Unknown");
125*043036a2SApple OSS Distributions 			}
126*043036a2SApple OSS Distributions 		}
127*043036a2SApple OSS Distributions 
128*043036a2SApple OSS Distributions 		if (sleepOptionsDict) {
129*043036a2SApple OSS Distributions 			// Publish Sleep Options in registry under root_domain
130*043036a2SApple OSS Distributions 			fOwner->setProperty( kRootDomainSleepOptionsKey, sleepOptionsDict);
131*043036a2SApple OSS Distributions 		} else {
132*043036a2SApple OSS Distributions 			// No options
133*043036a2SApple OSS Distributions 			// Clear any pre-existing options
134*043036a2SApple OSS Distributions 			fOwner->removeProperty( kRootDomainSleepOptionsKey );
135*043036a2SApple OSS Distributions 		}
136*043036a2SApple OSS Distributions 
137*043036a2SApple OSS Distributions 		*returnCode = fOwner->sleepSystemOptions( sleepOptionsDict );
138*043036a2SApple OSS Distributions 		OSSafeReleaseNULL(unserializedObject);
139*043036a2SApple OSS Distributions 		OSSafeReleaseNULL(unserializeErrorString);
140*043036a2SApple OSS Distributions 	} else {
141*043036a2SApple OSS Distributions 		*returnCode = kIOReturnNotPrivileged;
142*043036a2SApple OSS Distributions 	}
143*043036a2SApple OSS Distributions 
144*043036a2SApple OSS Distributions 	return kIOReturnSuccess;
145*043036a2SApple OSS Distributions }
146*043036a2SApple OSS Distributions 
147*043036a2SApple OSS Distributions IOReturn
secureSetAggressiveness(unsigned long type,unsigned long newLevel,int * return_code)148*043036a2SApple OSS Distributions RootDomainUserClient::secureSetAggressiveness(
149*043036a2SApple OSS Distributions 	unsigned long   type,
150*043036a2SApple OSS Distributions 	unsigned long   newLevel,
151*043036a2SApple OSS Distributions 	int             *return_code )
152*043036a2SApple OSS Distributions {
153*043036a2SApple OSS Distributions 	int             local_priv = 0;
154*043036a2SApple OSS Distributions 	int             admin_priv = 0;
155*043036a2SApple OSS Distributions 	IOReturn        ret = kIOReturnNotPrivileged;
156*043036a2SApple OSS Distributions 
157*043036a2SApple OSS Distributions 	ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeLocalUser);
158*043036a2SApple OSS Distributions 	local_priv = (kIOReturnSuccess == ret);
159*043036a2SApple OSS Distributions 
160*043036a2SApple OSS Distributions 	ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
161*043036a2SApple OSS Distributions 	admin_priv = (kIOReturnSuccess == ret);
162*043036a2SApple OSS Distributions 
163*043036a2SApple OSS Distributions 	if ((local_priv || admin_priv) && fOwner) {
164*043036a2SApple OSS Distributions 		*return_code = fOwner->setAggressiveness(type, newLevel);
165*043036a2SApple OSS Distributions 	} else {
166*043036a2SApple OSS Distributions 		*return_code = kIOReturnNotPrivileged;
167*043036a2SApple OSS Distributions 	}
168*043036a2SApple OSS Distributions 	return kIOReturnSuccess;
169*043036a2SApple OSS Distributions }
170*043036a2SApple OSS Distributions 
171*043036a2SApple OSS Distributions IOReturn
secureSetMaintenanceWakeCalendar(IOPMCalendarStruct * inCalendar,uint32_t * returnCode)172*043036a2SApple OSS Distributions RootDomainUserClient::secureSetMaintenanceWakeCalendar(
173*043036a2SApple OSS Distributions 	IOPMCalendarStruct      *inCalendar,
174*043036a2SApple OSS Distributions 	uint32_t                *returnCode)
175*043036a2SApple OSS Distributions {
176*043036a2SApple OSS Distributions 	int                     admin_priv = 0;
177*043036a2SApple OSS Distributions 	IOReturn                ret = kIOReturnNotPrivileged;
178*043036a2SApple OSS Distributions 
179*043036a2SApple OSS Distributions 	ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
180*043036a2SApple OSS Distributions 	admin_priv = (kIOReturnSuccess == ret);
181*043036a2SApple OSS Distributions 
182*043036a2SApple OSS Distributions 	if (admin_priv && fOwner) {
183*043036a2SApple OSS Distributions 		*returnCode = fOwner->setMaintenanceWakeCalendar(inCalendar);
184*043036a2SApple OSS Distributions 	} else {
185*043036a2SApple OSS Distributions 		*returnCode = kIOReturnNotPrivileged;
186*043036a2SApple OSS Distributions 	}
187*043036a2SApple OSS Distributions 	return kIOReturnSuccess;
188*043036a2SApple OSS Distributions }
189*043036a2SApple OSS Distributions 
190*043036a2SApple OSS Distributions IOReturn
secureSetUserAssertionLevels(uint32_t assertionBitfield)191*043036a2SApple OSS Distributions RootDomainUserClient::secureSetUserAssertionLevels(
192*043036a2SApple OSS Distributions 	uint32_t    assertionBitfield)
193*043036a2SApple OSS Distributions {
194*043036a2SApple OSS Distributions 	int                     admin_priv = 0;
195*043036a2SApple OSS Distributions 	IOReturn                ret = kIOReturnNotPrivileged;
196*043036a2SApple OSS Distributions 
197*043036a2SApple OSS Distributions 	ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
198*043036a2SApple OSS Distributions 	admin_priv = (kIOReturnSuccess == ret);
199*043036a2SApple OSS Distributions 
200*043036a2SApple OSS Distributions 	if (admin_priv && fOwner) {
201*043036a2SApple OSS Distributions 		ret = fOwner->setPMAssertionUserLevels(assertionBitfield);
202*043036a2SApple OSS Distributions 	} else {
203*043036a2SApple OSS Distributions 		ret = kIOReturnNotPrivileged;
204*043036a2SApple OSS Distributions 	}
205*043036a2SApple OSS Distributions 	return kIOReturnSuccess;
206*043036a2SApple OSS Distributions }
207*043036a2SApple OSS Distributions 
208*043036a2SApple OSS Distributions IOReturn
secureGetSystemSleepType(uint32_t * outSleepType,uint32_t * sleepTimer)209*043036a2SApple OSS Distributions RootDomainUserClient::secureGetSystemSleepType(
210*043036a2SApple OSS Distributions 	uint32_t    *outSleepType, uint32_t *sleepTimer)
211*043036a2SApple OSS Distributions {
212*043036a2SApple OSS Distributions 	int                     admin_priv = 0;
213*043036a2SApple OSS Distributions 	IOReturn                ret;
214*043036a2SApple OSS Distributions 
215*043036a2SApple OSS Distributions 	ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
216*043036a2SApple OSS Distributions 	admin_priv = (kIOReturnSuccess == ret);
217*043036a2SApple OSS Distributions 
218*043036a2SApple OSS Distributions 	if (admin_priv && fOwner) {
219*043036a2SApple OSS Distributions 		ret = fOwner->getSystemSleepType(outSleepType, sleepTimer);
220*043036a2SApple OSS Distributions 	} else {
221*043036a2SApple OSS Distributions 		ret = kIOReturnNotPrivileged;
222*043036a2SApple OSS Distributions 	}
223*043036a2SApple OSS Distributions 	return ret;
224*043036a2SApple OSS Distributions }
225*043036a2SApple OSS Distributions 
226*043036a2SApple OSS Distributions IOReturn
secureAttemptIdleSleepAbort(uint32_t * outReverted)227*043036a2SApple OSS Distributions RootDomainUserClient::secureAttemptIdleSleepAbort(
228*043036a2SApple OSS Distributions 	uint32_t    *outReverted)
229*043036a2SApple OSS Distributions {
230*043036a2SApple OSS Distributions 	int                     admin_priv = 0;
231*043036a2SApple OSS Distributions 	IOReturn                ret;
232*043036a2SApple OSS Distributions 
233*043036a2SApple OSS Distributions 	ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
234*043036a2SApple OSS Distributions 	admin_priv = (kIOReturnSuccess == ret);
235*043036a2SApple OSS Distributions 
236*043036a2SApple OSS Distributions 	if (admin_priv && fOwner) {
237*043036a2SApple OSS Distributions 		*outReverted = (uint32_t) fOwner->attemptIdleSleepAbort();
238*043036a2SApple OSS Distributions 	} else {
239*043036a2SApple OSS Distributions 		ret = kIOReturnNotPrivileged;
240*043036a2SApple OSS Distributions 	}
241*043036a2SApple OSS Distributions 	return ret;
242*043036a2SApple OSS Distributions }
243*043036a2SApple OSS Distributions 
244*043036a2SApple OSS Distributions IOReturn
secureSetLockdownModeHibernation(uint32_t status)245*043036a2SApple OSS Distributions RootDomainUserClient::secureSetLockdownModeHibernation(
246*043036a2SApple OSS Distributions 	uint32_t status)
247*043036a2SApple OSS Distributions {
248*043036a2SApple OSS Distributions #if HIBERNATION
249*043036a2SApple OSS Distributions 	int                     admin_priv = 0;
250*043036a2SApple OSS Distributions 	IOReturn                ret;
251*043036a2SApple OSS Distributions 
252*043036a2SApple OSS Distributions 	ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
253*043036a2SApple OSS Distributions 	admin_priv = (kIOReturnSuccess == ret);
254*043036a2SApple OSS Distributions 
255*043036a2SApple OSS Distributions 	if (admin_priv && fOwner) {
256*043036a2SApple OSS Distributions 		fOwner->setLockdownModeHibernation(status);
257*043036a2SApple OSS Distributions 	} else {
258*043036a2SApple OSS Distributions 		ret = kIOReturnNotPrivileged;
259*043036a2SApple OSS Distributions 	}
260*043036a2SApple OSS Distributions 	return kIOReturnSuccess;
261*043036a2SApple OSS Distributions #else
262*043036a2SApple OSS Distributions 	return kIOReturnError;
263*043036a2SApple OSS Distributions #endif
264*043036a2SApple OSS Distributions }
265*043036a2SApple OSS Distributions 
266*043036a2SApple OSS Distributions IOReturn
clientClose(void)267*043036a2SApple OSS Distributions RootDomainUserClient::clientClose( void )
268*043036a2SApple OSS Distributions {
269*043036a2SApple OSS Distributions 	terminate();
270*043036a2SApple OSS Distributions 
271*043036a2SApple OSS Distributions 	return kIOReturnSuccess;
272*043036a2SApple OSS Distributions }
273*043036a2SApple OSS Distributions 
274*043036a2SApple OSS Distributions void
stop(IOService * provider)275*043036a2SApple OSS Distributions RootDomainUserClient::stop( IOService *provider)
276*043036a2SApple OSS Distributions {
277*043036a2SApple OSS Distributions 	if (fOwningTask) {
278*043036a2SApple OSS Distributions 		task_deallocate(fOwningTask);
279*043036a2SApple OSS Distributions 		fOwningTask = NULL;
280*043036a2SApple OSS Distributions 	}
281*043036a2SApple OSS Distributions 
282*043036a2SApple OSS Distributions 	super::stop(provider);
283*043036a2SApple OSS Distributions }
284*043036a2SApple OSS Distributions 
285*043036a2SApple OSS Distributions IOReturn
externalMethod(uint32_t selector,IOExternalMethodArgumentsOpaque * args)286*043036a2SApple OSS Distributions RootDomainUserClient::externalMethod(uint32_t selector, IOExternalMethodArgumentsOpaque * args )
287*043036a2SApple OSS Distributions {
288*043036a2SApple OSS Distributions 	static const IOExternalMethodDispatch2022 dispatchArray[] = {
289*043036a2SApple OSS Distributions 		[kPMSetAggressiveness] = {
290*043036a2SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
291*043036a2SApple OSS Distributions 			.checkScalarInputCount    = 2,
292*043036a2SApple OSS Distributions 			.checkStructureInputSize  = 0,
293*043036a2SApple OSS Distributions 			.checkScalarOutputCount   = 1,
294*043036a2SApple OSS Distributions 			.checkStructureOutputSize = 0,
295*043036a2SApple OSS Distributions 			.allowAsync               = false,
296*043036a2SApple OSS Distributions 			.checkEntitlement         = NULL,
297*043036a2SApple OSS Distributions 		},
298*043036a2SApple OSS Distributions 		[kPMGetAggressiveness] = {
299*043036a2SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
300*043036a2SApple OSS Distributions 			.checkScalarInputCount    = 1,
301*043036a2SApple OSS Distributions 			.checkStructureInputSize  = 0,
302*043036a2SApple OSS Distributions 			.checkScalarOutputCount   = 1,
303*043036a2SApple OSS Distributions 			.checkStructureOutputSize = 0,
304*043036a2SApple OSS Distributions 			.allowAsync               = false,
305*043036a2SApple OSS Distributions 			.checkEntitlement         = NULL,
306*043036a2SApple OSS Distributions 		},
307*043036a2SApple OSS Distributions 		[kPMSleepSystem] = {
308*043036a2SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
309*043036a2SApple OSS Distributions 			.checkScalarInputCount    = 0,
310*043036a2SApple OSS Distributions 			.checkStructureInputSize  = 0,
311*043036a2SApple OSS Distributions 			.checkScalarOutputCount   = 1,
312*043036a2SApple OSS Distributions 			.checkStructureOutputSize = 0,
313*043036a2SApple OSS Distributions 			.allowAsync               = false,
314*043036a2SApple OSS Distributions 			.checkEntitlement         = NULL,
315*043036a2SApple OSS Distributions 		},
316*043036a2SApple OSS Distributions 		[kPMAllowPowerChange] = {
317*043036a2SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
318*043036a2SApple OSS Distributions 			.checkScalarInputCount    = 1,
319*043036a2SApple OSS Distributions 			.checkStructureInputSize  = 0,
320*043036a2SApple OSS Distributions 			.checkScalarOutputCount   = 0,
321*043036a2SApple OSS Distributions 			.checkStructureOutputSize = 0,
322*043036a2SApple OSS Distributions 			.allowAsync               = false,
323*043036a2SApple OSS Distributions 			.checkEntitlement         = NULL,
324*043036a2SApple OSS Distributions 		},
325*043036a2SApple OSS Distributions 		[kPMCancelPowerChange] = {
326*043036a2SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
327*043036a2SApple OSS Distributions 			.checkScalarInputCount    = 1,
328*043036a2SApple OSS Distributions 			.checkStructureInputSize  = 0,
329*043036a2SApple OSS Distributions 			.checkScalarOutputCount   = 0,
330*043036a2SApple OSS Distributions 			.checkStructureOutputSize = 0,
331*043036a2SApple OSS Distributions 			.allowAsync               = false,
332*043036a2SApple OSS Distributions 			.checkEntitlement         = NULL,
333*043036a2SApple OSS Distributions 		},
334*043036a2SApple OSS Distributions 		[kPMShutdownSystem] = {
335*043036a2SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
336*043036a2SApple OSS Distributions 			.checkScalarInputCount    = 0,
337*043036a2SApple OSS Distributions 			.checkStructureInputSize  = 0,
338*043036a2SApple OSS Distributions 			.checkScalarOutputCount   = 0,
339*043036a2SApple OSS Distributions 			.checkStructureOutputSize = 0,
340*043036a2SApple OSS Distributions 			.allowAsync               = false,
341*043036a2SApple OSS Distributions 			.checkEntitlement         = NULL,
342*043036a2SApple OSS Distributions 		},
343*043036a2SApple OSS Distributions 		[kPMRestartSystem] = {
344*043036a2SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
345*043036a2SApple OSS Distributions 			.checkScalarInputCount    = 0,
346*043036a2SApple OSS Distributions 			.checkStructureInputSize  = 0,
347*043036a2SApple OSS Distributions 			.checkScalarOutputCount   = 0,
348*043036a2SApple OSS Distributions 			.checkStructureOutputSize = 0,
349*043036a2SApple OSS Distributions 			.allowAsync               = false,
350*043036a2SApple OSS Distributions 			.checkEntitlement         = NULL,
351*043036a2SApple OSS Distributions 		},
352*043036a2SApple OSS Distributions 		[kPMSleepSystemOptions] = {
353*043036a2SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
354*043036a2SApple OSS Distributions 			.checkScalarInputCount    = 0,
355*043036a2SApple OSS Distributions 			.checkStructureInputSize  = kIOUCVariableStructureSize,
356*043036a2SApple OSS Distributions 			.checkScalarOutputCount   = 0,
357*043036a2SApple OSS Distributions 			.checkStructureOutputSize = sizeof(uint32_t),
358*043036a2SApple OSS Distributions 			.allowAsync               = false,
359*043036a2SApple OSS Distributions 			.checkEntitlement         = NULL,
360*043036a2SApple OSS Distributions 		},
361*043036a2SApple OSS Distributions 		[kPMSetMaintenanceWakeCalendar] = {
362*043036a2SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
363*043036a2SApple OSS Distributions 			.checkScalarInputCount    = 0,
364*043036a2SApple OSS Distributions 			.checkStructureInputSize  = sizeof(IOPMCalendarStruct),
365*043036a2SApple OSS Distributions 			.checkScalarOutputCount   = 0,
366*043036a2SApple OSS Distributions 			.checkStructureOutputSize = sizeof(uint32_t),
367*043036a2SApple OSS Distributions 			.allowAsync               = false,
368*043036a2SApple OSS Distributions 			.checkEntitlement         = NULL,
369*043036a2SApple OSS Distributions 		},
370*043036a2SApple OSS Distributions 		[kPMSetUserAssertionLevels] = {
371*043036a2SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
372*043036a2SApple OSS Distributions 			.checkScalarInputCount    = 1,
373*043036a2SApple OSS Distributions 			.checkStructureInputSize  = 0,
374*043036a2SApple OSS Distributions 			.checkScalarOutputCount   = 0,
375*043036a2SApple OSS Distributions 			.checkStructureOutputSize = 0,
376*043036a2SApple OSS Distributions 			.allowAsync               = false,
377*043036a2SApple OSS Distributions 			.checkEntitlement         = NULL,
378*043036a2SApple OSS Distributions 		},
379*043036a2SApple OSS Distributions 		[kPMActivityTickle] = {
380*043036a2SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
381*043036a2SApple OSS Distributions 			.checkScalarInputCount    = 0,
382*043036a2SApple OSS Distributions 			.checkStructureInputSize  = 0,
383*043036a2SApple OSS Distributions 			.checkScalarOutputCount   = 0,
384*043036a2SApple OSS Distributions 			.checkStructureOutputSize = 0,
385*043036a2SApple OSS Distributions 			.allowAsync               = false,
386*043036a2SApple OSS Distributions 			.checkEntitlement         = NULL,
387*043036a2SApple OSS Distributions 		},
388*043036a2SApple OSS Distributions 		[kPMSetClamshellSleepState] = {
389*043036a2SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
390*043036a2SApple OSS Distributions 			.checkScalarInputCount    = 1,
391*043036a2SApple OSS Distributions 			.checkStructureInputSize  = 0,
392*043036a2SApple OSS Distributions 			.checkScalarOutputCount   = 0,
393*043036a2SApple OSS Distributions 			.checkStructureOutputSize = 0,
394*043036a2SApple OSS Distributions 			.allowAsync               = false,
395*043036a2SApple OSS Distributions 			.checkEntitlement         = NULL,
396*043036a2SApple OSS Distributions 		},
397*043036a2SApple OSS Distributions 		[kPMGetSystemSleepType] = {
398*043036a2SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
399*043036a2SApple OSS Distributions 			.checkScalarInputCount    = 0,
400*043036a2SApple OSS Distributions 			.checkStructureInputSize  = 0,
401*043036a2SApple OSS Distributions 			.checkScalarOutputCount   = 2,
402*043036a2SApple OSS Distributions 			.checkStructureOutputSize = 0,
403*043036a2SApple OSS Distributions 			.allowAsync               = false,
404*043036a2SApple OSS Distributions 			.checkEntitlement         = NULL,
405*043036a2SApple OSS Distributions 		},
406*043036a2SApple OSS Distributions 		[kPMSleepWakeWatchdogEnable] = {
407*043036a2SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
408*043036a2SApple OSS Distributions 			.checkScalarInputCount    = 0,
409*043036a2SApple OSS Distributions 			.checkStructureInputSize  = 0,
410*043036a2SApple OSS Distributions 			.checkScalarOutputCount   = 0,
411*043036a2SApple OSS Distributions 			.checkStructureOutputSize = 0,
412*043036a2SApple OSS Distributions 			.allowAsync               = false,
413*043036a2SApple OSS Distributions 			.checkEntitlement         = NULL,
414*043036a2SApple OSS Distributions 		},
415*043036a2SApple OSS Distributions 		[kPMSleepWakeDebugTrig] = {
416*043036a2SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
417*043036a2SApple OSS Distributions 			.checkScalarInputCount    = 0,
418*043036a2SApple OSS Distributions 			.checkStructureInputSize  = 0,
419*043036a2SApple OSS Distributions 			.checkScalarOutputCount   = 0,
420*043036a2SApple OSS Distributions 			.checkStructureOutputSize = 0,
421*043036a2SApple OSS Distributions 			.allowAsync               = false,
422*043036a2SApple OSS Distributions 			.checkEntitlement         = NULL,
423*043036a2SApple OSS Distributions 		},
424*043036a2SApple OSS Distributions 		[kPMSetDisplayPowerOn] = {
425*043036a2SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
426*043036a2SApple OSS Distributions 			.checkScalarInputCount    = 1,
427*043036a2SApple OSS Distributions 			.checkStructureInputSize  = 0,
428*043036a2SApple OSS Distributions 			.checkScalarOutputCount   = 0,
429*043036a2SApple OSS Distributions 			.checkStructureOutputSize = 0,
430*043036a2SApple OSS Distributions 			.allowAsync               = false,
431*043036a2SApple OSS Distributions 			.checkEntitlement         = NULL,
432*043036a2SApple OSS Distributions 		},
433*043036a2SApple OSS Distributions 		[kPMRequestIdleSleepRevert] = {
434*043036a2SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
435*043036a2SApple OSS Distributions 			.checkScalarInputCount    = 0,
436*043036a2SApple OSS Distributions 			.checkStructureInputSize  = 0,
437*043036a2SApple OSS Distributions 			.checkScalarOutputCount   = 1,
438*043036a2SApple OSS Distributions 			.checkStructureOutputSize = 0,
439*043036a2SApple OSS Distributions 			.allowAsync               = false,
440*043036a2SApple OSS Distributions 			.checkEntitlement         = NULL,
441*043036a2SApple OSS Distributions 		},
442*043036a2SApple OSS Distributions 		[kPMSetLDMHibernationDisable] = {
443*043036a2SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
444*043036a2SApple OSS Distributions 			.checkScalarInputCount    = 1,
445*043036a2SApple OSS Distributions 			.checkStructureInputSize  = 0,
446*043036a2SApple OSS Distributions 			.checkScalarOutputCount   = 0,
447*043036a2SApple OSS Distributions 			.checkStructureOutputSize = 0,
448*043036a2SApple OSS Distributions 			.allowAsync               = false,
449*043036a2SApple OSS Distributions 			.checkEntitlement         = NULL,
450*043036a2SApple OSS Distributions 		},
451*043036a2SApple OSS Distributions 	};
452*043036a2SApple OSS Distributions 
453*043036a2SApple OSS Distributions 	return dispatchExternalMethod(selector, args, dispatchArray, sizeof(dispatchArray) / sizeof(dispatchArray[0]), this, NULL);
454*043036a2SApple OSS Distributions }
455*043036a2SApple OSS Distributions IOReturn
externalMethodDispatched(OSObject * target,void * reference,IOExternalMethodArguments * arguments)456*043036a2SApple OSS Distributions RootDomainUserClient::externalMethodDispatched(OSObject * target, void * reference, IOExternalMethodArguments * arguments)
457*043036a2SApple OSS Distributions {
458*043036a2SApple OSS Distributions 	IOReturn    ret = kIOReturnBadArgument;
459*043036a2SApple OSS Distributions 	RootDomainUserClient * me = (typeof(me))target;
460*043036a2SApple OSS Distributions 	switch (arguments->selector) {
461*043036a2SApple OSS Distributions 	case kPMSetAggressiveness:
462*043036a2SApple OSS Distributions 		ret = me->secureSetAggressiveness(
463*043036a2SApple OSS Distributions 			(unsigned long)arguments->scalarInput[0],
464*043036a2SApple OSS Distributions 			(unsigned long)arguments->scalarInput[1],
465*043036a2SApple OSS Distributions 			(int *)&arguments->scalarOutput[0]);
466*043036a2SApple OSS Distributions 		break;
467*043036a2SApple OSS Distributions 
468*043036a2SApple OSS Distributions 	case kPMGetAggressiveness:
469*043036a2SApple OSS Distributions 		ret = me->fOwner->getAggressiveness(
470*043036a2SApple OSS Distributions 			(unsigned long)arguments->scalarInput[0],
471*043036a2SApple OSS Distributions 			(unsigned long *)&arguments->scalarOutput[0]);
472*043036a2SApple OSS Distributions 		break;
473*043036a2SApple OSS Distributions 
474*043036a2SApple OSS Distributions 	case kPMSleepSystem:
475*043036a2SApple OSS Distributions 		ret = me->secureSleepSystem(
476*043036a2SApple OSS Distributions 			(uint32_t *)&arguments->scalarOutput[0]);
477*043036a2SApple OSS Distributions 		break;
478*043036a2SApple OSS Distributions 
479*043036a2SApple OSS Distributions 	case kPMAllowPowerChange:
480*043036a2SApple OSS Distributions 		ret = me->fOwner->allowPowerChange(
481*043036a2SApple OSS Distributions 			arguments->scalarInput[0]);
482*043036a2SApple OSS Distributions 		break;
483*043036a2SApple OSS Distributions 
484*043036a2SApple OSS Distributions 	case kPMCancelPowerChange:
485*043036a2SApple OSS Distributions 		ret = me->fOwner->cancelPowerChange(
486*043036a2SApple OSS Distributions 			arguments->scalarInput[0]);
487*043036a2SApple OSS Distributions 		break;
488*043036a2SApple OSS Distributions 
489*043036a2SApple OSS Distributions 	case kPMShutdownSystem:
490*043036a2SApple OSS Distributions 		// deprecated interface
491*043036a2SApple OSS Distributions 		ret = kIOReturnUnsupported;
492*043036a2SApple OSS Distributions 		break;
493*043036a2SApple OSS Distributions 
494*043036a2SApple OSS Distributions 	case kPMRestartSystem:
495*043036a2SApple OSS Distributions 		// deprecated interface
496*043036a2SApple OSS Distributions 		ret = kIOReturnUnsupported;
497*043036a2SApple OSS Distributions 		break;
498*043036a2SApple OSS Distributions 
499*043036a2SApple OSS Distributions 	case kPMSleepSystemOptions:
500*043036a2SApple OSS Distributions 		ret = me->secureSleepSystemOptions(
501*043036a2SApple OSS Distributions 			arguments->structureInput,
502*043036a2SApple OSS Distributions 			arguments->structureInputSize,
503*043036a2SApple OSS Distributions 			(uint32_t *)&arguments->structureOutput);
504*043036a2SApple OSS Distributions 		break;
505*043036a2SApple OSS Distributions 	case kPMSetMaintenanceWakeCalendar:
506*043036a2SApple OSS Distributions 		ret = me->secureSetMaintenanceWakeCalendar(
507*043036a2SApple OSS Distributions 			(IOPMCalendarStruct *)arguments->structureInput,
508*043036a2SApple OSS Distributions 			(uint32_t *)&arguments->structureOutput);
509*043036a2SApple OSS Distributions 		arguments->structureOutputSize = sizeof(uint32_t);
510*043036a2SApple OSS Distributions 		break;
511*043036a2SApple OSS Distributions 
512*043036a2SApple OSS Distributions 	case kPMSetUserAssertionLevels:
513*043036a2SApple OSS Distributions 		ret = me->secureSetUserAssertionLevels(
514*043036a2SApple OSS Distributions 			(uint32_t)arguments->scalarInput[0]);
515*043036a2SApple OSS Distributions 		break;
516*043036a2SApple OSS Distributions 
517*043036a2SApple OSS Distributions 	case kPMActivityTickle:
518*043036a2SApple OSS Distributions 		if (me->fOwner->checkSystemCanSustainFullWake()) {
519*043036a2SApple OSS Distributions 			me->fOwner->reportUserInput();
520*043036a2SApple OSS Distributions 			me->fOwner->setProperty(kIOPMRootDomainWakeTypeKey, "UserActivity Assertion");
521*043036a2SApple OSS Distributions 		}
522*043036a2SApple OSS Distributions 		ret = kIOReturnSuccess;
523*043036a2SApple OSS Distributions 		break;
524*043036a2SApple OSS Distributions 
525*043036a2SApple OSS Distributions 	case kPMSetClamshellSleepState:
526*043036a2SApple OSS Distributions 		me->fOwner->setClamShellSleepDisable(arguments->scalarInput[0] ? true : false,
527*043036a2SApple OSS Distributions 		    IOPMrootDomain::kClamshellSleepDisablePowerd);
528*043036a2SApple OSS Distributions 		ret = kIOReturnSuccess;
529*043036a2SApple OSS Distributions 		break;
530*043036a2SApple OSS Distributions 
531*043036a2SApple OSS Distributions 	case kPMGetSystemSleepType:
532*043036a2SApple OSS Distributions 		ret = me->secureGetSystemSleepType(
533*043036a2SApple OSS Distributions 			(uint32_t *) &arguments->scalarOutput[0],
534*043036a2SApple OSS Distributions 			(uint32_t *) &arguments->scalarOutput[1]);
535*043036a2SApple OSS Distributions 		break;
536*043036a2SApple OSS Distributions 
537*043036a2SApple OSS Distributions #if defined(__i386__) || defined(__x86_64__)
538*043036a2SApple OSS Distributions 	case kPMSleepWakeWatchdogEnable:
539*043036a2SApple OSS Distributions 		ret = clientHasPrivilege(me->fOwningTask, kIOClientPrivilegeAdministrator);
540*043036a2SApple OSS Distributions 		if (ret == kIOReturnSuccess) {
541*043036a2SApple OSS Distributions 			me->fOwner->sleepWakeDebugEnableWdog();
542*043036a2SApple OSS Distributions 		}
543*043036a2SApple OSS Distributions 		break;
544*043036a2SApple OSS Distributions 
545*043036a2SApple OSS Distributions 	case kPMSleepWakeDebugTrig:
546*043036a2SApple OSS Distributions 		ret = clientHasPrivilege(me->fOwningTask, kIOClientPrivilegeAdministrator);
547*043036a2SApple OSS Distributions 		if (ret == kIOReturnSuccess) {
548*043036a2SApple OSS Distributions 			me->fOwner->sleepWakeDebugTrig(false);
549*043036a2SApple OSS Distributions 		}
550*043036a2SApple OSS Distributions 		break;
551*043036a2SApple OSS Distributions #endif
552*043036a2SApple OSS Distributions 
553*043036a2SApple OSS Distributions 	case kPMSetDisplayPowerOn:
554*043036a2SApple OSS Distributions 		ret = clientHasPrivilege(me->fOwningTask, kIOClientPrivilegeAdministrator);
555*043036a2SApple OSS Distributions 		if (ret == kIOReturnSuccess) {
556*043036a2SApple OSS Distributions 			me->fOwner->setDisplayPowerOn((uint32_t)arguments->scalarInput[0]);
557*043036a2SApple OSS Distributions 		}
558*043036a2SApple OSS Distributions 		break;
559*043036a2SApple OSS Distributions 
560*043036a2SApple OSS Distributions 	case kPMRequestIdleSleepRevert:
561*043036a2SApple OSS Distributions 		ret = me->secureAttemptIdleSleepAbort(
562*043036a2SApple OSS Distributions 			(uint32_t *) &arguments->scalarOutput[0]);
563*043036a2SApple OSS Distributions 		break;
564*043036a2SApple OSS Distributions 
565*043036a2SApple OSS Distributions 	case kPMSetLDMHibernationDisable:
566*043036a2SApple OSS Distributions 		ret = me->secureSetLockdownModeHibernation((uint32_t)arguments->scalarInput[0]);
567*043036a2SApple OSS Distributions 		break;
568*043036a2SApple OSS Distributions 
569*043036a2SApple OSS Distributions 
570*043036a2SApple OSS Distributions 	default:
571*043036a2SApple OSS Distributions 		// bad selector
572*043036a2SApple OSS Distributions 		return kIOReturnBadArgument;
573*043036a2SApple OSS Distributions 	}
574*043036a2SApple OSS Distributions 
575*043036a2SApple OSS Distributions 	return ret;
576*043036a2SApple OSS Distributions }
577*043036a2SApple OSS Distributions 
578*043036a2SApple OSS Distributions /* getTargetAndMethodForIndex
579*043036a2SApple OSS Distributions  * Not used. We prefer to use externalMethod() for user client invocations.
580*043036a2SApple OSS Distributions  * We maintain getTargetAndExternalMethod since it's an exported symbol,
581*043036a2SApple OSS Distributions  * and only for that reason.
582*043036a2SApple OSS Distributions  */
583*043036a2SApple OSS Distributions IOExternalMethod *
getTargetAndMethodForIndex(IOService ** targetP,UInt32 index)584*043036a2SApple OSS Distributions RootDomainUserClient::getTargetAndMethodForIndex(
585*043036a2SApple OSS Distributions 	IOService ** targetP, UInt32 index )
586*043036a2SApple OSS Distributions {
587*043036a2SApple OSS Distributions 	// DO NOT EDIT
588*043036a2SApple OSS Distributions 	return super::getTargetAndMethodForIndex(targetP, index);
589*043036a2SApple OSS Distributions }
590*043036a2SApple OSS Distributions 
591*043036a2SApple OSS Distributions /* setPreventative
592*043036a2SApple OSS Distributions  * Does nothing. Exists only for exported symbol compatibility.
593*043036a2SApple OSS Distributions  */
594*043036a2SApple OSS Distributions void
setPreventative(UInt32 on_off,UInt32 types_of_sleep)595*043036a2SApple OSS Distributions RootDomainUserClient::setPreventative(UInt32 on_off, UInt32 types_of_sleep)
596*043036a2SApple OSS Distributions {
597*043036a2SApple OSS Distributions 	return;
598*043036a2SApple OSS Distributions }           // DO NOT EDIT
599