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