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