]> git.saurik.com Git - apple/xnu.git/blobdiff - iokit/Kernel/RootDomainUserClient.cpp
xnu-2782.40.9.tar.gz
[apple/xnu.git] / iokit / Kernel / RootDomainUserClient.cpp
index 29c90deef577fc29d1e3be0eb8b4737f21b1510a..ae122f4c1494b218e69b15de9379c550ad578fcd 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 1998-2012 Apple Computer, Inc. All rights reserved.
  *
  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
  *
  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
@@ -36,6 +36,8 @@
 #include <IOKit/IOBufferMemoryDescriptor.h>
 #include "RootDomainUserClient.h"
 #include <IOKit/pwr_mgt/IOPMLibDefs.h>
 #include <IOKit/IOBufferMemoryDescriptor.h>
 #include "RootDomainUserClient.h"
 #include <IOKit/pwr_mgt/IOPMLibDefs.h>
+#include <IOKit/pwr_mgt/IOPMPrivate.h>
+#include <sys/proc.h>
 
 #define super IOUserClient
 
 
 #define super IOUserClient
 
@@ -45,17 +47,17 @@ OSDefineMetaClassAndStructors(RootDomainUserClient, IOUserClient)
 
 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 
 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
-bool RootDomainUserClient::initWithTask(task_t owningTask, void *security_id, 
-                                       UInt32 type, OSDictionary * properties)
+bool RootDomainUserClient::initWithTask(task_t owningTask, void *security_id,
+                    UInt32 type, OSDictionary * properties)
 {
     if (properties)
 {
     if (properties)
-       properties->setObject(kIOUserClientCrossEndianCompatibleKey, kOSBooleanTrue);
+    properties->setObject(kIOUserClientCrossEndianCompatibleKey, kOSBooleanTrue);
 
     if (!super::initWithTask(owningTask, security_id, type, properties))
 
     if (!super::initWithTask(owningTask, security_id, type, properties))
-       return false;
+    return false;
 
     fOwningTask = owningTask;
 
     fOwningTask = owningTask;
-    task_reference (fOwningTask);    
+    task_reference (fOwningTask);
     return true;
 }
 
     return true;
 }
 
@@ -76,9 +78,9 @@ IOReturn RootDomainUserClient::secureSleepSystem( uint32_t *return_code )
     return secureSleepSystemOptions(NULL, 0, return_code);
 }
 
     return secureSleepSystemOptions(NULL, 0, return_code);
 }
 
-IOReturn RootDomainUserClient::secureSleepSystemOptions( 
-    const void      *inOptions, 
-    IOByteCount     inOptionsSize __unused,
+IOReturn RootDomainUserClient::secureSleepSystemOptions(
+    const void      *inOptions,
+    IOByteCount     inOptionsSize,
     uint32_t        *returnCode)
 {
 
     uint32_t        *returnCode)
 {
 
@@ -90,39 +92,44 @@ IOReturn RootDomainUserClient::secureSleepSystemOptions(
 
     ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeLocalUser);
     local_priv = (kIOReturnSuccess == ret);
 
     ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeLocalUser);
     local_priv = (kIOReturnSuccess == ret);
-    
+
     ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
     admin_priv = (kIOReturnSuccess == ret);
     ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
     admin_priv = (kIOReturnSuccess == ret);
-    
-    
+
+
     if (inOptions)
     {
         unserializedOptions = OSDynamicCast( OSDictionary,
     if (inOptions)
     {
         unserializedOptions = OSDynamicCast( OSDictionary,
-                                             OSUnserializeXML((const char *)inOptions, &unserializeErrorString));
-    
+                                             OSUnserializeXML((const char *)inOptions, inOptionsSize, &unserializeErrorString));
+
         if (!unserializedOptions) {
         if (!unserializedOptions) {
-            IOLog("IOPMRootDomain SleepSystem unserialization failure: %s\n", 
+            IOLog("IOPMRootDomain SleepSystem unserialization failure: %s\n",
                 unserializeErrorString ? unserializeErrorString->getCStringNoCopy() : "Unknown");
         }
     }
 
                 unserializeErrorString ? unserializeErrorString->getCStringNoCopy() : "Unknown");
         }
     }
 
-    if ( (local_priv || admin_priv) 
-          && fOwner ) 
+    if ( (local_priv || admin_priv) && fOwner )
     {
     {
-        if (unserializedOptions) 
+        proc_t p;
+        p = (proc_t)get_bsdtask_info(fOwningTask);
+        if (p) {
+            fOwner->setProperty("SleepRequestedByPID", proc_pid(p), 32);
+        }
+
+        if (unserializedOptions)
         {
             // Publish Sleep Options in registry under root_domain
         {
             // Publish Sleep Options in registry under root_domain
-            fOwner->setProperty( kRootDomainSleepOptionsKey, unserializedOptions);            
+            fOwner->setProperty( kRootDomainSleepOptionsKey, unserializedOptions);
 
             *returnCode = fOwner->sleepSystemOptions( unserializedOptions );
 
 
             *returnCode = fOwner->sleepSystemOptions( unserializedOptions );
 
-            unserializedOptions->release();        
+            unserializedOptions->release();
         } else {
             // No options
             // Clear any pre-existing options
             fOwner->removeProperty( kRootDomainSleepOptionsKey );
 
         } else {
             // No options
             // Clear any pre-existing options
             fOwner->removeProperty( kRootDomainSleepOptionsKey );
 
-            *returnCode = fOwner->sleepSystemOptions( NULL );        
+            *returnCode = fOwner->sleepSystemOptions( NULL );
         }
 
     } else {
         }
 
     } else {
@@ -132,7 +139,7 @@ IOReturn RootDomainUserClient::secureSleepSystemOptions(
     return kIOReturnSuccess;
 }
 
     return kIOReturnSuccess;
 }
 
-IOReturn RootDomainUserClient::secureSetAggressiveness( 
+IOReturn RootDomainUserClient::secureSetAggressiveness(
     unsigned long   type,
     unsigned long   newLevel,
     int             *return_code )
     unsigned long   type,
     unsigned long   newLevel,
     int             *return_code )
@@ -143,7 +150,7 @@ IOReturn RootDomainUserClient::secureSetAggressiveness(
 
     ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeLocalUser);
     local_priv = (kIOReturnSuccess == ret);
 
     ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeLocalUser);
     local_priv = (kIOReturnSuccess == ret);
-    
+
     ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
     admin_priv = (kIOReturnSuccess == ret);
 
     ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
     admin_priv = (kIOReturnSuccess == ret);
 
@@ -161,7 +168,7 @@ IOReturn RootDomainUserClient::secureSetMaintenanceWakeCalendar(
 {
     int                     admin_priv = 0;
     IOReturn                ret = kIOReturnNotPrivileged;
 {
     int                     admin_priv = 0;
     IOReturn                ret = kIOReturnNotPrivileged;
-    
+
     ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
     admin_priv = (kIOReturnSuccess == ret);
 
     ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
     admin_priv = (kIOReturnSuccess == ret);
 
@@ -178,7 +185,7 @@ IOReturn RootDomainUserClient::secureSetUserAssertionLevels(
 {
     int                     admin_priv = 0;
     IOReturn                ret = kIOReturnNotPrivileged;
 {
     int                     admin_priv = 0;
     IOReturn                ret = kIOReturnNotPrivileged;
-    
+
     ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
     admin_priv = (kIOReturnSuccess == ret);
 
     ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
     admin_priv = (kIOReturnSuccess == ret);
 
@@ -190,50 +197,44 @@ IOReturn RootDomainUserClient::secureSetUserAssertionLevels(
     return kIOReturnSuccess;
 }
 
     return kIOReturnSuccess;
 }
 
+IOReturn RootDomainUserClient::secureGetSystemSleepType(
+    uint32_t    *outSleepType)
+{
+    int                     admin_priv = 0;
+    IOReturn                ret;
+
+    ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
+    admin_priv = (kIOReturnSuccess == ret);
+
+    if (admin_priv && fOwner) {
+        ret = fOwner->getSystemSleepType(outSleepType);
+    } else {
+        ret = kIOReturnNotPrivileged;
+    }
+    return ret;
+}
+
 IOReturn RootDomainUserClient::clientClose( void )
 {
     detach(fOwner);
 IOReturn RootDomainUserClient::clientClose( void )
 {
     detach(fOwner);
-    
+
     if(fOwningTask) {
         task_deallocate(fOwningTask);
         fOwningTask = 0;
     if(fOwningTask) {
         task_deallocate(fOwningTask);
         fOwningTask = 0;
-    }   
-    
-    return kIOReturnSuccess;
-}
-
-IOReturn RootDomainUserClient::clientMemoryForType(
-    UInt32 type,
-    IOOptionBits *options,
-    IOMemoryDescriptor ** memory)
-{
-    if (!fOwner)
-        return kIOReturnNotReady;
-
-    if (kPMRootDomainMapTraceBuffer == type)
-    {
-        *memory = fOwner->getPMTraceMemoryDescriptor();
-        if (*memory) {
-            (*memory)->retain();
-            *options = 0;
-            return kIOReturnSuccess;
-        } else {
-            return kIOReturnNotFound;
-        }
-
     }
     }
-    return kIOReturnUnsupported;
+
+    return kIOReturnSuccess;
 }
 
 IOReturn RootDomainUserClient::externalMethod(
 }
 
 IOReturn RootDomainUserClient::externalMethod(
-    uint32_t selector, 
+    uint32_t selector,
     IOExternalMethodArguments * arguments,
     IOExternalMethodArguments * arguments,
-    IOExternalMethodDispatch * dispatch __unused, 
+    IOExternalMethodDispatch * dispatch __unused,
     OSObject * target __unused,
     void * reference __unused )
 {
     OSObject * target __unused,
     void * reference __unused )
 {
-    IOReturn    ret = kIOReturnBadArgument;    
-    
+    IOReturn    ret = kIOReturnBadArgument;
+
     switch (selector)
     {
         case kPMSetAggressiveness:
     switch (selector)
     {
         case kPMSetAggressiveness:
@@ -246,7 +247,7 @@ IOReturn RootDomainUserClient::externalMethod(
                                 (int *)&arguments->scalarOutput[0]);
             }
             break;
                                 (int *)&arguments->scalarOutput[0]);
             }
             break;
-        
+
         case kPMGetAggressiveness:
             if ((1 == arguments->scalarInputCount)
                 && (1 == arguments->scalarOutputCount))
         case kPMGetAggressiveness:
             if ((1 == arguments->scalarInputCount)
                 && (1 == arguments->scalarOutputCount))
@@ -256,12 +257,12 @@ IOReturn RootDomainUserClient::externalMethod(
                                 (unsigned long *)&arguments->scalarOutput[0]);
             }
             break;
                                 (unsigned long *)&arguments->scalarOutput[0]);
             }
             break;
-        
+
         case kPMSleepSystem:
             if (1 == arguments->scalarOutputCount)
             {
                 ret = this->secureSleepSystem(
         case kPMSleepSystem:
             if (1 == arguments->scalarOutputCount)
             {
                 ret = this->secureSleepSystem(
-                                (uint32_t *)&arguments->scalarOutput[0]);            
+                                (uint32_t *)&arguments->scalarOutput[0]);
             }
             break;
 
             }
             break;
 
@@ -299,65 +300,62 @@ IOReturn RootDomainUserClient::externalMethod(
             break;
         case kPMSetMaintenanceWakeCalendar:
             ret = this->secureSetMaintenanceWakeCalendar(
             break;
         case kPMSetMaintenanceWakeCalendar:
             ret = this->secureSetMaintenanceWakeCalendar(
-                    (IOPMCalendarStruct *)arguments->structureInput, 
+                    (IOPMCalendarStruct *)arguments->structureInput,
                     (uint32_t *)&arguments->structureOutput);
             arguments->structureOutputSize = sizeof(uint32_t);
             break;
                     (uint32_t *)&arguments->structureOutput);
             arguments->structureOutputSize = sizeof(uint32_t);
             break;
-            
+
         case kPMSetUserAssertionLevels:
             ret = this->secureSetUserAssertionLevels(
                         (uint32_t)arguments->scalarInput[0]);
             break;
         case kPMSetUserAssertionLevels:
             ret = this->secureSetUserAssertionLevels(
                         (uint32_t)arguments->scalarInput[0]);
             break;
-            
-/*
-        case kPMMethodCopySystemTimeline:
-            // intentional fallthrough
-        case kPMMethodCopyDetailedTimeline:
 
 
-            if (!arguments->structureOutputDescriptor)
+        case kPMActivityTickle:
+            if ( fOwner->checkSystemCanSustainFullWake() )
             {
             {
-                // TODO: Force IOKit.framework to always send this data out
-                // of line; so I don't have to create a MemoryDescriptor here.
-                mem_size = arguments->structureOutputSize;
-                mem = IOMemoryDescriptor::withAddressRange(
-                                    (mach_vm_address_t)arguments->structureOutput, 
-                                    (mach_vm_size_t)mem_size,
-                                    kIODirectionIn, current_task());
-            } else {
-                mem_size = arguments->structureOutputDescriptorSize;
-                if (( mem = arguments->structureOutputDescriptor ))
-                    mem->retain();   
+               fOwner->reportUserInput( );
+               fOwner->setProperty(kIOPMRootDomainWakeTypeKey, "UserActivity Assertion");
             }
             }
-            
-            if (mem)
+            ret = kIOReturnSuccess;
+            break;
+
+        case kPMSetClamshellSleepState:
+            fOwner->setDisableClamShellSleep(arguments->scalarInput[0] ? true : false);
+            ret = kIOReturnSuccess;
+            break;
+
+        case kPMGetSystemSleepType:
+            if (1 == arguments->scalarOutputCount)
             {
             {
-                mem->prepare(kIODirectionNone);
-    
-                if (kPMMethodCopySystemTimeline == selector) {
-                    arguments->scalarOutput[0] = fOwner->copySystemTimeline(
-                                    mem, &mem_size);
-                } 
-                else
-                if (kPMMethodCopyDetailedTimeline == selector) {
-                    arguments->scalarOutput[0] = fOwner->copyDetailedTimeline(
-                                    mem, &mem_size);
-                }
-            
-                if (arguments->structureOutputDescriptor) {
-                    arguments->structureOutputDescriptorSize = mem_size;
-                } else {
-                    arguments->structureOutputSize = mem_size;
-                }
-            
-                mem->release();
-
-                ret = kIOReturnSuccess;
-            } else {
-                ret = kIOReturnCannotWire;
+                ret = this->secureGetSystemSleepType(
+                        (uint32_t *) &arguments->scalarOutput[0]);
             }
             }
-            
             break;
             break;
-*/
+
+#if defined(__i386__) || defined(__x86_64__)
+        case kPMSleepWakeWatchdogEnable:
+            ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
+            if (ret == kIOReturnSuccess)
+               fOwner->sleepWakeDebugEnableWdog();
+            break;
+
+
+        case kPMSleepWakeDebugTrig:
+            ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
+            if (ret == kIOReturnSuccess)
+               fOwner->sleepWakeDebugTrig(false);
+            break;
+#endif
+
+        case kPMSetDisplayPowerOn:
+            if (1 == arguments->scalarInputCount)
+            {
+                ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
+                if (ret == kIOReturnSuccess)
+                    fOwner->setDisplayPowerOn((uint32_t)arguments->scalarInput[0]);
+            }
+            break;
+
         default:
             // bad selector
             return kIOReturnBadArgument;
         default:
             // bad selector
             return kIOReturnBadArgument;
@@ -371,7 +369,7 @@ IOReturn RootDomainUserClient::externalMethod(
  * We maintain getTargetAndExternalMethod since it's an exported symbol,
  * and only for that reason.
  */
  * We maintain getTargetAndExternalMethod since it's an exported symbol,
  * and only for that reason.
  */
-IOExternalMethod * RootDomainUserClient::getTargetAndMethodForIndex( 
+IOExternalMethod * RootDomainUserClient::getTargetAndMethodForIndex(
     IOService ** targetP, UInt32 index )
 {
     // DO NOT EDIT
     IOService ** targetP, UInt32 index )
 {
     // DO NOT EDIT
@@ -381,6 +379,6 @@ IOExternalMethod * RootDomainUserClient::getTargetAndMethodForIndex(
 /* setPreventative
  * Does nothing. Exists only for exported symbol compatibility.
  */
 /* setPreventative
  * Does nothing. Exists only for exported symbol compatibility.
  */
-void 
+void
 RootDomainUserClient::setPreventative(UInt32 on_off, UInt32 types_of_sleep)
 { return; } // DO NOT EDIT
 RootDomainUserClient::setPreventative(UInt32 on_off, UInt32 types_of_sleep)
 { return; } // DO NOT EDIT