Loading...
iokit/Kernel/RootDomainUserClient.cpp xnu-10063.141.1 xnu-12377.61.12
--- xnu/xnu-10063.141.1/iokit/Kernel/RootDomainUserClient.cpp
+++ xnu/xnu-12377.61.12/iokit/Kernel/RootDomainUserClient.cpp
@@ -224,6 +224,46 @@
 }
 
 IOReturn
+RootDomainUserClient::secureAttemptIdleSleepAbort(
+	uint32_t    *outReverted)
+{
+	int                     admin_priv = 0;
+	IOReturn                ret;
+
+	ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
+	admin_priv = (kIOReturnSuccess == ret);
+
+	if (admin_priv && fOwner) {
+		*outReverted = (uint32_t) fOwner->attemptIdleSleepAbort();
+	} else {
+		ret = kIOReturnNotPrivileged;
+	}
+	return ret;
+}
+
+IOReturn
+RootDomainUserClient::secureSetLockdownModeHibernation(
+	uint32_t status)
+{
+#if HIBERNATION
+	int                     admin_priv = 0;
+	IOReturn                ret;
+
+	ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
+	admin_priv = (kIOReturnSuccess == ret);
+
+	if (admin_priv && fOwner) {
+		fOwner->setLockdownModeHibernation(status);
+	} else {
+		ret = kIOReturnNotPrivileged;
+	}
+	return kIOReturnSuccess;
+#else
+	return kIOReturnError;
+#endif
+}
+
+IOReturn
 RootDomainUserClient::clientClose( void )
 {
 	terminate();
@@ -382,6 +422,24 @@
 			.checkEntitlement         = NULL,
 		},
 		[kPMSetDisplayPowerOn] = {
+			.function                 = &RootDomainUserClient::externalMethodDispatched,
+			.checkScalarInputCount    = 1,
+			.checkStructureInputSize  = 0,
+			.checkScalarOutputCount   = 0,
+			.checkStructureOutputSize = 0,
+			.allowAsync               = false,
+			.checkEntitlement         = NULL,
+		},
+		[kPMRequestIdleSleepRevert] = {
+			.function                 = &RootDomainUserClient::externalMethodDispatched,
+			.checkScalarInputCount    = 0,
+			.checkStructureInputSize  = 0,
+			.checkScalarOutputCount   = 1,
+			.checkStructureOutputSize = 0,
+			.allowAsync               = false,
+			.checkEntitlement         = NULL,
+		},
+		[kPMSetLDMHibernationDisable] = {
 			.function                 = &RootDomainUserClient::externalMethodDispatched,
 			.checkScalarInputCount    = 1,
 			.checkStructureInputSize  = 0,
@@ -484,7 +542,6 @@
 		}
 		break;
 
-
 	case kPMSleepWakeDebugTrig:
 		ret = clientHasPrivilege(me->fOwningTask, kIOClientPrivilegeAdministrator);
 		if (ret == kIOReturnSuccess) {
@@ -499,6 +556,16 @@
 			me->fOwner->setDisplayPowerOn((uint32_t)arguments->scalarInput[0]);
 		}
 		break;
+
+	case kPMRequestIdleSleepRevert:
+		ret = me->secureAttemptIdleSleepAbort(
+			(uint32_t *) &arguments->scalarOutput[0]);
+		break;
+
+	case kPMSetLDMHibernationDisable:
+		ret = me->secureSetLockdownModeHibernation((uint32_t)arguments->scalarInput[0]);
+		break;
+
 
 	default:
 		// bad selector