Loading...
iokit/Kernel/RootDomainUserClient.cpp xnu-10063.141.1 xnu-11215.61.5
--- xnu/xnu-10063.141.1/iokit/Kernel/RootDomainUserClient.cpp
+++ xnu/xnu-11215.61.5/iokit/Kernel/RootDomainUserClient.cpp
@@ -224,6 +224,24 @@
 }
 
 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::clientClose( void )
 {
 	terminate();
@@ -386,6 +404,15 @@
 			.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,
@@ -484,7 +511,6 @@
 		}
 		break;
 
-
 	case kPMSleepWakeDebugTrig:
 		ret = clientHasPrivilege(me->fOwningTask, kIOClientPrivilegeAdministrator);
 		if (ret == kIOReturnSuccess) {
@@ -499,6 +525,12 @@
 			me->fOwner->setDisplayPowerOn((uint32_t)arguments->scalarInput[0]);
 		}
 		break;
+
+	case kPMRequestIdleSleepRevert:
+		ret = me->secureAttemptIdleSleepAbort(
+			(uint32_t *) &arguments->scalarOutput[0]);
+		break;
+
 
 	default:
 		// bad selector