1368ad365SApple OSS Distributions /*
2bb611c8fSApple OSS Distributions  * Copyright (c) 1998-2020 Apple Computer, Inc. All rights reserved.
3368ad365SApple OSS Distributions  *
4e13b1fa5SApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5368ad365SApple OSS Distributions  *
6e13b1fa5SApple OSS Distributions  * This file contains Original Code and/or Modifications of Original Code
7e13b1fa5SApple OSS Distributions  * as defined in and that are subject to the Apple Public Source License
8e13b1fa5SApple OSS Distributions  * Version 2.0 (the 'License'). You may not use this file except in
9e13b1fa5SApple OSS Distributions  * compliance with the License. The rights granted to you under the License
10e13b1fa5SApple OSS Distributions  * may not be used to create, or enable the creation or redistribution of,
11e13b1fa5SApple OSS Distributions  * unlawful or unlicensed copies of an Apple operating system, or to
12e13b1fa5SApple OSS Distributions  * circumvent, violate, or enable the circumvention or violation of, any
13e13b1fa5SApple OSS Distributions  * terms of an Apple operating system software license agreement.
14368ad365SApple OSS Distributions  *
15e13b1fa5SApple OSS Distributions  * Please obtain a copy of the License at
16e13b1fa5SApple OSS Distributions  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17e13b1fa5SApple OSS Distributions  *
18e13b1fa5SApple OSS Distributions  * The Original Code and all software distributed under the License are
19e13b1fa5SApple OSS Distributions  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20368ad365SApple OSS Distributions  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21368ad365SApple OSS Distributions  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22e13b1fa5SApple OSS Distributions  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23e13b1fa5SApple OSS Distributions  * Please see the License for the specific language governing rights and
24e13b1fa5SApple OSS Distributions  * limitations under the License.
25368ad365SApple OSS Distributions  *
26e13b1fa5SApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27368ad365SApple OSS Distributions  */
28368ad365SApple OSS Distributions /*
29368ad365SApple OSS Distributions  * Copyright (c) 1999 Apple Computer, Inc.  All rights reserved.
30368ad365SApple OSS Distributions  *
31368ad365SApple OSS Distributions  */
32368ad365SApple OSS Distributions 
33368ad365SApple OSS Distributions #include <IOKit/assert.h>
34368ad365SApple OSS Distributions #include <IOKit/IOLib.h>
35e13b1fa5SApple OSS Distributions #include <IOKit/IOKitKeys.h>
36368ad365SApple OSS Distributions #include <IOKit/IOBufferMemoryDescriptor.h>
37368ad365SApple OSS Distributions #include "RootDomainUserClient.h"
38368ad365SApple OSS Distributions #include <IOKit/pwr_mgt/IOPMLibDefs.h>
39d0c1fef6SApple OSS Distributions #include <IOKit/pwr_mgt/IOPMPrivate.h>
40186b8fceSApple OSS Distributions #include <sys/proc.h>
41368ad365SApple OSS Distributions 
425c2921b0SApple OSS Distributions #define super IOUserClient2022
43368ad365SApple OSS Distributions 
44368ad365SApple OSS Distributions /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
45368ad365SApple OSS Distributions 
OSDefineMetaClassAndStructors(RootDomainUserClient,IOUserClient2022)465c2921b0SApple OSS Distributions OSDefineMetaClassAndStructors(RootDomainUserClient, IOUserClient2022)
47368ad365SApple OSS Distributions 
48368ad365SApple OSS Distributions /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
49368ad365SApple OSS Distributions 
50a5e72196SApple OSS Distributions bool
51a5e72196SApple OSS Distributions RootDomainUserClient::initWithTask(task_t owningTask, void *security_id,
52e13b1fa5SApple OSS Distributions     UInt32 type, OSDictionary * properties)
5314e3d835SApple OSS Distributions {
54a5e72196SApple OSS Distributions 	if (properties) {
55e13b1fa5SApple OSS Distributions 		properties->setObject(kIOUserClientCrossEndianCompatibleKey, kOSBooleanTrue);
56a5e72196SApple OSS Distributions 	}
57e13b1fa5SApple OSS Distributions 
58a5e72196SApple OSS Distributions 	if (!super::initWithTask(owningTask, security_id, type, properties)) {
5914e3d835SApple OSS Distributions 		return false;
60a5e72196SApple OSS Distributions 	}
6114e3d835SApple OSS Distributions 
6214e3d835SApple OSS Distributions 	fOwningTask = owningTask;
6314e3d835SApple OSS Distributions 	task_reference(fOwningTask);
6414e3d835SApple OSS Distributions 	return true;
6514e3d835SApple OSS Distributions }
6614e3d835SApple OSS Distributions 
6714e3d835SApple OSS Distributions 
68a5e72196SApple OSS Distributions bool
start(IOService * provider)69a5e72196SApple OSS Distributions RootDomainUserClient::start( IOService * provider )
70368ad365SApple OSS Distributions {
71368ad365SApple OSS Distributions 	assert(OSDynamicCast(IOPMrootDomain, provider));
72a5e72196SApple OSS Distributions 	if (!super::start(provider)) {
73368ad365SApple OSS Distributions 		return false;
74a5e72196SApple OSS Distributions 	}
75368ad365SApple OSS Distributions 	fOwner = (IOPMrootDomain *)provider;
76368ad365SApple OSS Distributions 
775c2921b0SApple OSS Distributions 	setProperty(kIOUserClientDefaultLockingKey, kOSBooleanTrue);
785c2921b0SApple OSS Distributions 	setProperty(kIOUserClientDefaultLockingSetPropertiesKey, kOSBooleanTrue);
795c2921b0SApple OSS Distributions 	setProperty(kIOUserClientDefaultLockingSingleThreadExternalMethodKey, kOSBooleanFalse);
805c2921b0SApple OSS Distributions 
815c2921b0SApple OSS Distributions 	setProperty(kIOUserClientEntitlementsKey, kOSBooleanFalse);
82368ad365SApple OSS Distributions 
83368ad365SApple OSS Distributions 	return true;
84368ad365SApple OSS Distributions }
85368ad365SApple OSS Distributions 
86a5e72196SApple OSS Distributions IOReturn
secureSleepSystem(uint32_t * return_code)87a5e72196SApple OSS Distributions RootDomainUserClient::secureSleepSystem( uint32_t *return_code )
8814e3d835SApple OSS Distributions {
89855239e5SApple OSS Distributions 	return secureSleepSystemOptions(NULL, 0, return_code);
90e13b1fa5SApple OSS Distributions }
91e13b1fa5SApple OSS Distributions 
92a5e72196SApple OSS Distributions IOReturn
secureSleepSystemOptions(const void * inOptions,IOByteCount inOptionsSize,uint32_t * returnCode)93a5e72196SApple OSS Distributions RootDomainUserClient::secureSleepSystemOptions(
94855239e5SApple OSS Distributions 	const void      *inOptions,
95186b8fceSApple OSS Distributions 	IOByteCount     inOptionsSize,
96855239e5SApple OSS Distributions 	uint32_t        *returnCode)
97e13b1fa5SApple OSS Distributions {
9814e3d835SApple OSS Distributions 	int             local_priv = 0;
9914e3d835SApple OSS Distributions 	int             admin_priv = 0;
10014e3d835SApple OSS Distributions 	IOReturn        ret = kIOReturnNotPrivileged;
10114e3d835SApple OSS Distributions 
10214e3d835SApple OSS Distributions 	ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeLocalUser);
10314e3d835SApple OSS Distributions 	local_priv = (kIOReturnSuccess == ret);
10414e3d835SApple OSS Distributions 
10514e3d835SApple OSS Distributions 	ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
10614e3d835SApple OSS Distributions 	admin_priv = (kIOReturnSuccess == ret);
10714e3d835SApple OSS Distributions 
108a5e72196SApple OSS Distributions 	if ((local_priv || admin_priv) && fOwner) {
109a5e72196SApple OSS Distributions 		OSString        *unserializeErrorString = NULL;
110a5e72196SApple OSS Distributions 		OSObject        *unserializedObject = NULL;
111a5e72196SApple OSS Distributions 		OSDictionary    *sleepOptionsDict = NULL; // do not release
112e13b1fa5SApple OSS Distributions 
113186b8fceSApple OSS Distributions 		proc_t p;
114186b8fceSApple OSS Distributions 		p = (proc_t)get_bsdtask_info(fOwningTask);
115186b8fceSApple OSS Distributions 		if (p) {
116186b8fceSApple OSS Distributions 			fOwner->setProperty("SleepRequestedByPID", proc_pid(p), 32);
117186b8fceSApple OSS Distributions 		}
118186b8fceSApple OSS Distributions 
119a5e72196SApple OSS Distributions 		if (inOptions) {
120a5e72196SApple OSS Distributions 			unserializedObject = OSUnserializeXML((const char *)inOptions, inOptionsSize, &unserializeErrorString);
121a5e72196SApple OSS Distributions 			sleepOptionsDict = OSDynamicCast( OSDictionary, unserializedObject);
122a5e72196SApple OSS Distributions 			if (!sleepOptionsDict) {
123a5e72196SApple OSS Distributions 				IOLog("IOPMRootDomain SleepSystem unserialization failure: %s\n",
124a5e72196SApple OSS Distributions 				    unserializeErrorString ? unserializeErrorString->getCStringNoCopy() : "Unknown");
125a5e72196SApple OSS Distributions 			}
126a5e72196SApple OSS Distributions 		}
127a5e72196SApple OSS Distributions 
128a5e72196SApple OSS Distributions 		if (sleepOptionsDict) {
129e13b1fa5SApple OSS Distributions 			// Publish Sleep Options in registry under root_domain
130a5e72196SApple OSS Distributions 			fOwner->setProperty( kRootDomainSleepOptionsKey, sleepOptionsDict);
131e13b1fa5SApple OSS Distributions 		} else {
132e13b1fa5SApple OSS Distributions 			// No options
133e13b1fa5SApple OSS Distributions 			// Clear any pre-existing options
134e13b1fa5SApple OSS Distributions 			fOwner->removeProperty( kRootDomainSleepOptionsKey );
135e13b1fa5SApple OSS Distributions 		}
136e13b1fa5SApple OSS Distributions 
137a5e72196SApple OSS Distributions 		*returnCode = fOwner->sleepSystemOptions( sleepOptionsDict );
138a5e72196SApple OSS Distributions 		OSSafeReleaseNULL(unserializedObject);
139a5e72196SApple OSS Distributions 		OSSafeReleaseNULL(unserializeErrorString);
140e13b1fa5SApple OSS Distributions 	} else {
141e13b1fa5SApple OSS Distributions 		*returnCode = kIOReturnNotPrivileged;
142e13b1fa5SApple OSS Distributions 	}
143e13b1fa5SApple OSS Distributions 
144e13b1fa5SApple OSS Distributions 	return kIOReturnSuccess;
14514e3d835SApple OSS Distributions }
14614e3d835SApple OSS Distributions 
147a5e72196SApple OSS Distributions IOReturn
secureSetAggressiveness(unsigned long type,unsigned long newLevel,int * return_code)148a5e72196SApple OSS Distributions RootDomainUserClient::secureSetAggressiveness(
14914e3d835SApple OSS Distributions 	unsigned long   type,
15014e3d835SApple OSS Distributions 	unsigned long   newLevel,
15114e3d835SApple OSS Distributions 	int             *return_code )
15214e3d835SApple OSS Distributions {
15314e3d835SApple OSS Distributions 	int             local_priv = 0;
15414e3d835SApple OSS Distributions 	int             admin_priv = 0;
15514e3d835SApple OSS Distributions 	IOReturn        ret = kIOReturnNotPrivileged;
15614e3d835SApple OSS Distributions 
15714e3d835SApple OSS Distributions 	ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeLocalUser);
15814e3d835SApple OSS Distributions 	local_priv = (kIOReturnSuccess == ret);
15914e3d835SApple OSS Distributions 
16014e3d835SApple OSS Distributions 	ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
16114e3d835SApple OSS Distributions 	admin_priv = (kIOReturnSuccess == ret);
16214e3d835SApple OSS Distributions 
16314e3d835SApple OSS Distributions 	if ((local_priv || admin_priv) && fOwner) {
16414e3d835SApple OSS Distributions 		*return_code = fOwner->setAggressiveness(type, newLevel);
16514e3d835SApple OSS Distributions 	} else {
16614e3d835SApple OSS Distributions 		*return_code = kIOReturnNotPrivileged;
16714e3d835SApple OSS Distributions 	}
168855239e5SApple OSS Distributions 	return kIOReturnSuccess;
16914e3d835SApple OSS Distributions }
17014e3d835SApple OSS Distributions 
171a5e72196SApple OSS Distributions IOReturn
secureSetMaintenanceWakeCalendar(IOPMCalendarStruct * inCalendar,uint32_t * returnCode)172a5e72196SApple OSS Distributions RootDomainUserClient::secureSetMaintenanceWakeCalendar(
173855239e5SApple OSS Distributions 	IOPMCalendarStruct      *inCalendar,
174855239e5SApple OSS Distributions 	uint32_t                *returnCode)
1753ca3bd55SApple OSS Distributions {
1763ca3bd55SApple OSS Distributions 	int                     admin_priv = 0;
1773ca3bd55SApple OSS Distributions 	IOReturn                ret = kIOReturnNotPrivileged;
1783ca3bd55SApple OSS Distributions 
1793ca3bd55SApple OSS Distributions 	ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
1803ca3bd55SApple OSS Distributions 	admin_priv = (kIOReturnSuccess == ret);
1813ca3bd55SApple OSS Distributions 
1823ca3bd55SApple OSS Distributions 	if (admin_priv && fOwner) {
1833ca3bd55SApple OSS Distributions 		*returnCode = fOwner->setMaintenanceWakeCalendar(inCalendar);
1843ca3bd55SApple OSS Distributions 	} else {
1853ca3bd55SApple OSS Distributions 		*returnCode = kIOReturnNotPrivileged;
186855239e5SApple OSS Distributions 	}
1873ca3bd55SApple OSS Distributions 	return kIOReturnSuccess;
1883ca3bd55SApple OSS Distributions }
189855239e5SApple OSS Distributions 
190a5e72196SApple OSS Distributions IOReturn
secureSetUserAssertionLevels(uint32_t assertionBitfield)191a5e72196SApple OSS Distributions RootDomainUserClient::secureSetUserAssertionLevels(
192855239e5SApple OSS Distributions 	uint32_t    assertionBitfield)
193855239e5SApple OSS Distributions {
194855239e5SApple OSS Distributions 	int                     admin_priv = 0;
195855239e5SApple OSS Distributions 	IOReturn                ret = kIOReturnNotPrivileged;
196855239e5SApple OSS Distributions 
197855239e5SApple OSS Distributions 	ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
198855239e5SApple OSS Distributions 	admin_priv = (kIOReturnSuccess == ret);
199855239e5SApple OSS Distributions 
200855239e5SApple OSS Distributions 	if (admin_priv && fOwner) {
201855239e5SApple OSS Distributions 		ret = fOwner->setPMAssertionUserLevels(assertionBitfield);
202855239e5SApple OSS Distributions 	} else {
203855239e5SApple OSS Distributions 		ret = kIOReturnNotPrivileged;
204855239e5SApple OSS Distributions 	}
205855239e5SApple OSS Distributions 	return kIOReturnSuccess;
2063ca3bd55SApple OSS Distributions }
207368ad365SApple OSS Distributions 
208a5e72196SApple OSS Distributions IOReturn
secureGetSystemSleepType(uint32_t * outSleepType,uint32_t * sleepTimer)209a5e72196SApple OSS Distributions RootDomainUserClient::secureGetSystemSleepType(
21076e12aa3SApple OSS Distributions 	uint32_t    *outSleepType, uint32_t *sleepTimer)
211186b8fceSApple OSS Distributions {
212186b8fceSApple OSS Distributions 	int                     admin_priv = 0;
213186b8fceSApple OSS Distributions 	IOReturn                ret;
214186b8fceSApple OSS Distributions 
215186b8fceSApple OSS Distributions 	ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
216186b8fceSApple OSS Distributions 	admin_priv = (kIOReturnSuccess == ret);
217186b8fceSApple OSS Distributions 
218186b8fceSApple OSS Distributions 	if (admin_priv && fOwner) {
21976e12aa3SApple OSS Distributions 		ret = fOwner->getSystemSleepType(outSleepType, sleepTimer);
220186b8fceSApple OSS Distributions 	} else {
221186b8fceSApple OSS Distributions 		ret = kIOReturnNotPrivileged;
222186b8fceSApple OSS Distributions 	}
223186b8fceSApple OSS Distributions 	return ret;
224186b8fceSApple OSS Distributions }
225186b8fceSApple OSS Distributions 
226a5e72196SApple OSS Distributions IOReturn
secureAttemptIdleSleepAbort(uint32_t * outReverted)227*8d741a5dSApple OSS Distributions RootDomainUserClient::secureAttemptIdleSleepAbort(
228*8d741a5dSApple OSS Distributions 	uint32_t    *outReverted)
229*8d741a5dSApple OSS Distributions {
230*8d741a5dSApple OSS Distributions 	int                     admin_priv = 0;
231*8d741a5dSApple OSS Distributions 	IOReturn                ret;
232*8d741a5dSApple OSS Distributions 
233*8d741a5dSApple OSS Distributions 	ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
234*8d741a5dSApple OSS Distributions 	admin_priv = (kIOReturnSuccess == ret);
235*8d741a5dSApple OSS Distributions 
236*8d741a5dSApple OSS Distributions 	if (admin_priv && fOwner) {
237*8d741a5dSApple OSS Distributions 		*outReverted = (uint32_t) fOwner->attemptIdleSleepAbort();
238*8d741a5dSApple OSS Distributions 	} else {
239*8d741a5dSApple OSS Distributions 		ret = kIOReturnNotPrivileged;
240*8d741a5dSApple OSS Distributions 	}
241*8d741a5dSApple OSS Distributions 	return ret;
242*8d741a5dSApple OSS Distributions }
243*8d741a5dSApple OSS Distributions 
244*8d741a5dSApple OSS Distributions IOReturn
clientClose(void)245a5e72196SApple OSS Distributions RootDomainUserClient::clientClose( void )
246368ad365SApple OSS Distributions {
24776e12aa3SApple OSS Distributions 	terminate();
24814e3d835SApple OSS Distributions 
24976e12aa3SApple OSS Distributions 	return kIOReturnSuccess;
25076e12aa3SApple OSS Distributions }
25176e12aa3SApple OSS Distributions 
252a5e72196SApple OSS Distributions void
stop(IOService * provider)253a5e72196SApple OSS Distributions RootDomainUserClient::stop( IOService *provider)
25476e12aa3SApple OSS Distributions {
25514e3d835SApple OSS Distributions 	if (fOwningTask) {
25614e3d835SApple OSS Distributions 		task_deallocate(fOwningTask);
257a5e72196SApple OSS Distributions 		fOwningTask = NULL;
25814e3d835SApple OSS Distributions 	}
25914e3d835SApple OSS Distributions 
26076e12aa3SApple OSS Distributions 	super::stop(provider);
261368ad365SApple OSS Distributions }
262368ad365SApple OSS Distributions 
263a5e72196SApple OSS Distributions IOReturn
externalMethod(uint32_t selector,IOExternalMethodArgumentsOpaque * args)2645c2921b0SApple OSS Distributions RootDomainUserClient::externalMethod(uint32_t selector, IOExternalMethodArgumentsOpaque * args )
2655c2921b0SApple OSS Distributions {
2665c2921b0SApple OSS Distributions 	static const IOExternalMethodDispatch2022 dispatchArray[] = {
2675c2921b0SApple OSS Distributions 		[kPMSetAggressiveness] = {
2685c2921b0SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
2695c2921b0SApple OSS Distributions 			.checkScalarInputCount    = 2,
2705c2921b0SApple OSS Distributions 			.checkStructureInputSize  = 0,
2715c2921b0SApple OSS Distributions 			.checkScalarOutputCount   = 1,
2725c2921b0SApple OSS Distributions 			.checkStructureOutputSize = 0,
2735c2921b0SApple OSS Distributions 			.allowAsync               = false,
2745c2921b0SApple OSS Distributions 			.checkEntitlement         = NULL,
2755c2921b0SApple OSS Distributions 		},
2765c2921b0SApple OSS Distributions 		[kPMGetAggressiveness] = {
2775c2921b0SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
2785c2921b0SApple OSS Distributions 			.checkScalarInputCount    = 1,
2795c2921b0SApple OSS Distributions 			.checkStructureInputSize  = 0,
2805c2921b0SApple OSS Distributions 			.checkScalarOutputCount   = 1,
2815c2921b0SApple OSS Distributions 			.checkStructureOutputSize = 0,
2825c2921b0SApple OSS Distributions 			.allowAsync               = false,
2835c2921b0SApple OSS Distributions 			.checkEntitlement         = NULL,
2845c2921b0SApple OSS Distributions 		},
2855c2921b0SApple OSS Distributions 		[kPMSleepSystem] = {
2865c2921b0SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
2875c2921b0SApple OSS Distributions 			.checkScalarInputCount    = 0,
2885c2921b0SApple OSS Distributions 			.checkStructureInputSize  = 0,
2895c2921b0SApple OSS Distributions 			.checkScalarOutputCount   = 1,
2905c2921b0SApple OSS Distributions 			.checkStructureOutputSize = 0,
2915c2921b0SApple OSS Distributions 			.allowAsync               = false,
2925c2921b0SApple OSS Distributions 			.checkEntitlement         = NULL,
2935c2921b0SApple OSS Distributions 		},
2945c2921b0SApple OSS Distributions 		[kPMAllowPowerChange] = {
2955c2921b0SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
2965c2921b0SApple OSS Distributions 			.checkScalarInputCount    = 1,
2975c2921b0SApple OSS Distributions 			.checkStructureInputSize  = 0,
2985c2921b0SApple OSS Distributions 			.checkScalarOutputCount   = 0,
2995c2921b0SApple OSS Distributions 			.checkStructureOutputSize = 0,
3005c2921b0SApple OSS Distributions 			.allowAsync               = false,
3015c2921b0SApple OSS Distributions 			.checkEntitlement         = NULL,
3025c2921b0SApple OSS Distributions 		},
3035c2921b0SApple OSS Distributions 		[kPMCancelPowerChange] = {
3045c2921b0SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
3055c2921b0SApple OSS Distributions 			.checkScalarInputCount    = 1,
3065c2921b0SApple OSS Distributions 			.checkStructureInputSize  = 0,
3075c2921b0SApple OSS Distributions 			.checkScalarOutputCount   = 0,
3085c2921b0SApple OSS Distributions 			.checkStructureOutputSize = 0,
3095c2921b0SApple OSS Distributions 			.allowAsync               = false,
3105c2921b0SApple OSS Distributions 			.checkEntitlement         = NULL,
3115c2921b0SApple OSS Distributions 		},
3125c2921b0SApple OSS Distributions 		[kPMShutdownSystem] = {
3135c2921b0SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
3145c2921b0SApple OSS Distributions 			.checkScalarInputCount    = 0,
3155c2921b0SApple OSS Distributions 			.checkStructureInputSize  = 0,
3165c2921b0SApple OSS Distributions 			.checkScalarOutputCount   = 0,
3175c2921b0SApple OSS Distributions 			.checkStructureOutputSize = 0,
3185c2921b0SApple OSS Distributions 			.allowAsync               = false,
3195c2921b0SApple OSS Distributions 			.checkEntitlement         = NULL,
3205c2921b0SApple OSS Distributions 		},
3215c2921b0SApple OSS Distributions 		[kPMRestartSystem] = {
3225c2921b0SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
3235c2921b0SApple OSS Distributions 			.checkScalarInputCount    = 0,
3245c2921b0SApple OSS Distributions 			.checkStructureInputSize  = 0,
3255c2921b0SApple OSS Distributions 			.checkScalarOutputCount   = 0,
3265c2921b0SApple OSS Distributions 			.checkStructureOutputSize = 0,
3275c2921b0SApple OSS Distributions 			.allowAsync               = false,
3285c2921b0SApple OSS Distributions 			.checkEntitlement         = NULL,
3295c2921b0SApple OSS Distributions 		},
3305c2921b0SApple OSS Distributions 		[kPMSleepSystemOptions] = {
3315c2921b0SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
3325c2921b0SApple OSS Distributions 			.checkScalarInputCount    = 0,
3335c2921b0SApple OSS Distributions 			.checkStructureInputSize  = kIOUCVariableStructureSize,
3345c2921b0SApple OSS Distributions 			.checkScalarOutputCount   = 0,
3355c2921b0SApple OSS Distributions 			.checkStructureOutputSize = sizeof(uint32_t),
3365c2921b0SApple OSS Distributions 			.allowAsync               = false,
3375c2921b0SApple OSS Distributions 			.checkEntitlement         = NULL,
3385c2921b0SApple OSS Distributions 		},
3395c2921b0SApple OSS Distributions 		[kPMSetMaintenanceWakeCalendar] = {
3405c2921b0SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
3415c2921b0SApple OSS Distributions 			.checkScalarInputCount    = 0,
3425c2921b0SApple OSS Distributions 			.checkStructureInputSize  = sizeof(IOPMCalendarStruct),
3435c2921b0SApple OSS Distributions 			.checkScalarOutputCount   = 0,
3445c2921b0SApple OSS Distributions 			.checkStructureOutputSize = sizeof(uint32_t),
3455c2921b0SApple OSS Distributions 			.allowAsync               = false,
3465c2921b0SApple OSS Distributions 			.checkEntitlement         = NULL,
3475c2921b0SApple OSS Distributions 		},
3485c2921b0SApple OSS Distributions 		[kPMSetUserAssertionLevels] = {
3495c2921b0SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
3505c2921b0SApple OSS Distributions 			.checkScalarInputCount    = 1,
3515c2921b0SApple OSS Distributions 			.checkStructureInputSize  = 0,
3525c2921b0SApple OSS Distributions 			.checkScalarOutputCount   = 0,
3535c2921b0SApple OSS Distributions 			.checkStructureOutputSize = 0,
3545c2921b0SApple OSS Distributions 			.allowAsync               = false,
3555c2921b0SApple OSS Distributions 			.checkEntitlement         = NULL,
3565c2921b0SApple OSS Distributions 		},
3575c2921b0SApple OSS Distributions 		[kPMActivityTickle] = {
3585c2921b0SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
3595c2921b0SApple OSS Distributions 			.checkScalarInputCount    = 0,
3605c2921b0SApple OSS Distributions 			.checkStructureInputSize  = 0,
3615c2921b0SApple OSS Distributions 			.checkScalarOutputCount   = 0,
3625c2921b0SApple OSS Distributions 			.checkStructureOutputSize = 0,
3635c2921b0SApple OSS Distributions 			.allowAsync               = false,
3645c2921b0SApple OSS Distributions 			.checkEntitlement         = NULL,
3655c2921b0SApple OSS Distributions 		},
3665c2921b0SApple OSS Distributions 		[kPMSetClamshellSleepState] = {
3675c2921b0SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
3685c2921b0SApple OSS Distributions 			.checkScalarInputCount    = 1,
3695c2921b0SApple OSS Distributions 			.checkStructureInputSize  = 0,
3705c2921b0SApple OSS Distributions 			.checkScalarOutputCount   = 0,
3715c2921b0SApple OSS Distributions 			.checkStructureOutputSize = 0,
3725c2921b0SApple OSS Distributions 			.allowAsync               = false,
3735c2921b0SApple OSS Distributions 			.checkEntitlement         = NULL,
3745c2921b0SApple OSS Distributions 		},
3755c2921b0SApple OSS Distributions 		[kPMGetSystemSleepType] = {
3765c2921b0SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
3775c2921b0SApple OSS Distributions 			.checkScalarInputCount    = 0,
3785c2921b0SApple OSS Distributions 			.checkStructureInputSize  = 0,
3795c2921b0SApple OSS Distributions 			.checkScalarOutputCount   = 2,
3805c2921b0SApple OSS Distributions 			.checkStructureOutputSize = 0,
3815c2921b0SApple OSS Distributions 			.allowAsync               = false,
3825c2921b0SApple OSS Distributions 			.checkEntitlement         = NULL,
3835c2921b0SApple OSS Distributions 		},
3845c2921b0SApple OSS Distributions 		[kPMSleepWakeWatchdogEnable] = {
3855c2921b0SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
3865c2921b0SApple OSS Distributions 			.checkScalarInputCount    = 0,
3875c2921b0SApple OSS Distributions 			.checkStructureInputSize  = 0,
3885c2921b0SApple OSS Distributions 			.checkScalarOutputCount   = 0,
3895c2921b0SApple OSS Distributions 			.checkStructureOutputSize = 0,
3905c2921b0SApple OSS Distributions 			.allowAsync               = false,
3915c2921b0SApple OSS Distributions 			.checkEntitlement         = NULL,
3925c2921b0SApple OSS Distributions 		},
3935c2921b0SApple OSS Distributions 		[kPMSleepWakeDebugTrig] = {
3945c2921b0SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
3955c2921b0SApple OSS Distributions 			.checkScalarInputCount    = 0,
3965c2921b0SApple OSS Distributions 			.checkStructureInputSize  = 0,
3975c2921b0SApple OSS Distributions 			.checkScalarOutputCount   = 0,
3985c2921b0SApple OSS Distributions 			.checkStructureOutputSize = 0,
3995c2921b0SApple OSS Distributions 			.allowAsync               = false,
4005c2921b0SApple OSS Distributions 			.checkEntitlement         = NULL,
4015c2921b0SApple OSS Distributions 		},
4025c2921b0SApple OSS Distributions 		[kPMSetDisplayPowerOn] = {
4035c2921b0SApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
4045c2921b0SApple OSS Distributions 			.checkScalarInputCount    = 1,
4055c2921b0SApple OSS Distributions 			.checkStructureInputSize  = 0,
4065c2921b0SApple OSS Distributions 			.checkScalarOutputCount   = 0,
4075c2921b0SApple OSS Distributions 			.checkStructureOutputSize = 0,
4085c2921b0SApple OSS Distributions 			.allowAsync               = false,
4095c2921b0SApple OSS Distributions 			.checkEntitlement         = NULL,
4105c2921b0SApple OSS Distributions 		},
411*8d741a5dSApple OSS Distributions 		[kPMRequestIdleSleepRevert] = {
412*8d741a5dSApple OSS Distributions 			.function                 = &RootDomainUserClient::externalMethodDispatched,
413*8d741a5dSApple OSS Distributions 			.checkScalarInputCount    = 0,
414*8d741a5dSApple OSS Distributions 			.checkStructureInputSize  = 0,
415*8d741a5dSApple OSS Distributions 			.checkScalarOutputCount   = 1,
416*8d741a5dSApple OSS Distributions 			.checkStructureOutputSize = 0,
417*8d741a5dSApple OSS Distributions 			.allowAsync               = false,
418*8d741a5dSApple OSS Distributions 			.checkEntitlement         = NULL,
419*8d741a5dSApple OSS Distributions 		},
4205c2921b0SApple OSS Distributions 	};
4215c2921b0SApple OSS Distributions 
4225c2921b0SApple OSS Distributions 	return dispatchExternalMethod(selector, args, dispatchArray, sizeof(dispatchArray) / sizeof(dispatchArray[0]), this, NULL);
4235c2921b0SApple OSS Distributions }
4245c2921b0SApple OSS Distributions IOReturn
externalMethodDispatched(OSObject * target,void * reference,IOExternalMethodArguments * arguments)4255c2921b0SApple OSS Distributions RootDomainUserClient::externalMethodDispatched(OSObject * target, void * reference, IOExternalMethodArguments * arguments)
426855239e5SApple OSS Distributions {
427855239e5SApple OSS Distributions 	IOReturn    ret = kIOReturnBadArgument;
4285c2921b0SApple OSS Distributions 	RootDomainUserClient * me = (typeof(me))target;
4295c2921b0SApple OSS Distributions 	switch (arguments->selector) {
430855239e5SApple OSS Distributions 	case kPMSetAggressiveness:
4315c2921b0SApple OSS Distributions 		ret = me->secureSetAggressiveness(
432855239e5SApple OSS Distributions 			(unsigned long)arguments->scalarInput[0],
433855239e5SApple OSS Distributions 			(unsigned long)arguments->scalarInput[1],
434855239e5SApple OSS Distributions 			(int *)&arguments->scalarOutput[0]);
435855239e5SApple OSS Distributions 		break;
436855239e5SApple OSS Distributions 
437855239e5SApple OSS Distributions 	case kPMGetAggressiveness:
4385c2921b0SApple OSS Distributions 		ret = me->fOwner->getAggressiveness(
439855239e5SApple OSS Distributions 			(unsigned long)arguments->scalarInput[0],
440855239e5SApple OSS Distributions 			(unsigned long *)&arguments->scalarOutput[0]);
441855239e5SApple OSS Distributions 		break;
442855239e5SApple OSS Distributions 
443855239e5SApple OSS Distributions 	case kPMSleepSystem:
4445c2921b0SApple OSS Distributions 		ret = me->secureSleepSystem(
445855239e5SApple OSS Distributions 			(uint32_t *)&arguments->scalarOutput[0]);
446855239e5SApple OSS Distributions 		break;
447855239e5SApple OSS Distributions 
448855239e5SApple OSS Distributions 	case kPMAllowPowerChange:
4495c2921b0SApple OSS Distributions 		ret = me->fOwner->allowPowerChange(
450855239e5SApple OSS Distributions 			arguments->scalarInput[0]);
451855239e5SApple OSS Distributions 		break;
452855239e5SApple OSS Distributions 
453855239e5SApple OSS Distributions 	case kPMCancelPowerChange:
4545c2921b0SApple OSS Distributions 		ret = me->fOwner->cancelPowerChange(
455855239e5SApple OSS Distributions 			arguments->scalarInput[0]);
456855239e5SApple OSS Distributions 		break;
457855239e5SApple OSS Distributions 
458855239e5SApple OSS Distributions 	case kPMShutdownSystem:
4595c2921b0SApple OSS Distributions 		// deprecated interface
460855239e5SApple OSS Distributions 		ret = kIOReturnUnsupported;
461855239e5SApple OSS Distributions 		break;
462855239e5SApple OSS Distributions 
463855239e5SApple OSS Distributions 	case kPMRestartSystem:
4645c2921b0SApple OSS Distributions 		// deprecated interface
465855239e5SApple OSS Distributions 		ret = kIOReturnUnsupported;
466855239e5SApple OSS Distributions 		break;
467855239e5SApple OSS Distributions 
468855239e5SApple OSS Distributions 	case kPMSleepSystemOptions:
4695c2921b0SApple OSS Distributions 		ret = me->secureSleepSystemOptions(
470855239e5SApple OSS Distributions 			arguments->structureInput,
471855239e5SApple OSS Distributions 			arguments->structureInputSize,
4725c2921b0SApple OSS Distributions 			(uint32_t *)&arguments->structureOutput);
473855239e5SApple OSS Distributions 		break;
474855239e5SApple OSS Distributions 	case kPMSetMaintenanceWakeCalendar:
4755c2921b0SApple OSS Distributions 		ret = me->secureSetMaintenanceWakeCalendar(
476855239e5SApple OSS Distributions 			(IOPMCalendarStruct *)arguments->structureInput,
477855239e5SApple OSS Distributions 			(uint32_t *)&arguments->structureOutput);
478855239e5SApple OSS Distributions 		arguments->structureOutputSize = sizeof(uint32_t);
479855239e5SApple OSS Distributions 		break;
480855239e5SApple OSS Distributions 
481855239e5SApple OSS Distributions 	case kPMSetUserAssertionLevels:
4825c2921b0SApple OSS Distributions 		ret = me->secureSetUserAssertionLevels(
483855239e5SApple OSS Distributions 			(uint32_t)arguments->scalarInput[0]);
484855239e5SApple OSS Distributions 		break;
485855239e5SApple OSS Distributions 
486d0c1fef6SApple OSS Distributions 	case kPMActivityTickle:
4875c2921b0SApple OSS Distributions 		if (me->fOwner->checkSystemCanSustainFullWake()) {
4885c2921b0SApple OSS Distributions 			me->fOwner->reportUserInput();
4895c2921b0SApple OSS Distributions 			me->fOwner->setProperty(kIOPMRootDomainWakeTypeKey, "UserActivity Assertion");
490186b8fceSApple OSS Distributions 		}
491d0c1fef6SApple OSS Distributions 		ret = kIOReturnSuccess;
492d0c1fef6SApple OSS Distributions 		break;
493d0c1fef6SApple OSS Distributions 
494186b8fceSApple OSS Distributions 	case kPMSetClamshellSleepState:
4955c2921b0SApple OSS Distributions 		me->fOwner->setClamShellSleepDisable(arguments->scalarInput[0] ? true : false,
496bb611c8fSApple OSS Distributions 		    IOPMrootDomain::kClamshellSleepDisablePowerd);
497186b8fceSApple OSS Distributions 		ret = kIOReturnSuccess;
498186b8fceSApple OSS Distributions 		break;
499186b8fceSApple OSS Distributions 
500186b8fceSApple OSS Distributions 	case kPMGetSystemSleepType:
5015c2921b0SApple OSS Distributions 		ret = me->secureGetSystemSleepType(
50276e12aa3SApple OSS Distributions 			(uint32_t *) &arguments->scalarOutput[0],
50376e12aa3SApple OSS Distributions 			(uint32_t *) &arguments->scalarOutput[1]);
504186b8fceSApple OSS Distributions 		break;
505186b8fceSApple OSS Distributions 
506a3bb9fccSApple OSS Distributions #if defined(__i386__) || defined(__x86_64__)
507186b8fceSApple OSS Distributions 	case kPMSleepWakeWatchdogEnable:
5085c2921b0SApple OSS Distributions 		ret = clientHasPrivilege(me->fOwningTask, kIOClientPrivilegeAdministrator);
509a5e72196SApple OSS Distributions 		if (ret == kIOReturnSuccess) {
5105c2921b0SApple OSS Distributions 			me->fOwner->sleepWakeDebugEnableWdog();
511a5e72196SApple OSS Distributions 		}
512186b8fceSApple OSS Distributions 		break;
513186b8fceSApple OSS Distributions 
514186b8fceSApple OSS Distributions 	case kPMSleepWakeDebugTrig:
5155c2921b0SApple OSS Distributions 		ret = clientHasPrivilege(me->fOwningTask, kIOClientPrivilegeAdministrator);
516a5e72196SApple OSS Distributions 		if (ret == kIOReturnSuccess) {
5175c2921b0SApple OSS Distributions 			me->fOwner->sleepWakeDebugTrig(false);
518a5e72196SApple OSS Distributions 		}
519186b8fceSApple OSS Distributions 		break;
520a3bb9fccSApple OSS Distributions #endif
521186b8fceSApple OSS Distributions 
522186b8fceSApple OSS Distributions 	case kPMSetDisplayPowerOn:
5235c2921b0SApple OSS Distributions 		ret = clientHasPrivilege(me->fOwningTask, kIOClientPrivilegeAdministrator);
524a5e72196SApple OSS Distributions 		if (ret == kIOReturnSuccess) {
5255c2921b0SApple OSS Distributions 			me->fOwner->setDisplayPowerOn((uint32_t)arguments->scalarInput[0]);
526a5e72196SApple OSS Distributions 		}
527186b8fceSApple OSS Distributions 		break;
528855239e5SApple OSS Distributions 
529*8d741a5dSApple OSS Distributions 	case kPMRequestIdleSleepRevert:
530*8d741a5dSApple OSS Distributions 		ret = me->secureAttemptIdleSleepAbort(
531*8d741a5dSApple OSS Distributions 			(uint32_t *) &arguments->scalarOutput[0]);
532*8d741a5dSApple OSS Distributions 		break;
533*8d741a5dSApple OSS Distributions 
534*8d741a5dSApple OSS Distributions 
535855239e5SApple OSS Distributions 	default:
536855239e5SApple OSS Distributions 		// bad selector
537855239e5SApple OSS Distributions 		return kIOReturnBadArgument;
538855239e5SApple OSS Distributions 	}
539855239e5SApple OSS Distributions 
540855239e5SApple OSS Distributions 	return ret;
541855239e5SApple OSS Distributions }
542855239e5SApple OSS Distributions 
543855239e5SApple OSS Distributions /* getTargetAndMethodForIndex
544855239e5SApple OSS Distributions  * Not used. We prefer to use externalMethod() for user client invocations.
545855239e5SApple OSS Distributions  * We maintain getTargetAndExternalMethod since it's an exported symbol,
546855239e5SApple OSS Distributions  * and only for that reason.
547855239e5SApple OSS Distributions  */
548a5e72196SApple OSS Distributions IOExternalMethod *
getTargetAndMethodForIndex(IOService ** targetP,UInt32 index)549a5e72196SApple OSS Distributions RootDomainUserClient::getTargetAndMethodForIndex(
550855239e5SApple OSS Distributions 	IOService ** targetP, UInt32 index )
551855239e5SApple OSS Distributions {
552855239e5SApple OSS Distributions 	// DO NOT EDIT
553855239e5SApple OSS Distributions 	return super::getTargetAndMethodForIndex(targetP, index);
554855239e5SApple OSS Distributions }
555855239e5SApple OSS Distributions 
556855239e5SApple OSS Distributions /* setPreventative
557855239e5SApple OSS Distributions  * Does nothing. Exists only for exported symbol compatibility.
558855239e5SApple OSS Distributions  */
559368ad365SApple OSS Distributions void
setPreventative(UInt32 on_off,UInt32 types_of_sleep)560368ad365SApple OSS Distributions RootDomainUserClient::setPreventative(UInt32 on_off, UInt32 types_of_sleep)
561a5e72196SApple OSS Distributions {
562a5e72196SApple OSS Distributions 	return;
563a5e72196SApple OSS Distributions }           // DO NOT EDIT
564