2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
29 #include <IOKit/IOUserClient.h>
30 #include <IOKit/IOMessage.h>
31 #include <IOKit/system_management/IOWatchDogTimer.h>
32 #include <IOKit/pwr_mgt/RootDomain.h>
35 static IOReturn
IOWatchDogTimerSleepHandler(void *target
, void *refCon
,
38 void *messageArgument
,
42 #define kWatchDogEnabledProperty "IOWatchDogEnabled"
45 #define super IOService
47 OSDefineMetaClassAndAbstractStructors(IOWatchDogTimer
, IOService
);
49 OSMetaClassDefineReservedUnused(IOWatchDogTimer
, 0);
50 OSMetaClassDefineReservedUnused(IOWatchDogTimer
, 1);
51 OSMetaClassDefineReservedUnused(IOWatchDogTimer
, 2);
52 OSMetaClassDefineReservedUnused(IOWatchDogTimer
, 3);
54 bool IOWatchDogTimer::start(IOService
*provider
)
56 if (!super::start(provider
)) return false;
58 notifier
= registerSleepWakeInterest(IOWatchDogTimerSleepHandler
, this);
59 if (notifier
== 0) return false;
61 setProperty(kWatchDogEnabledProperty
, kOSBooleanFalse
);
69 void IOWatchDogTimer::stop(IOService
*provider
)
75 IOReturn
IOWatchDogTimer::setProperties(OSObject
*properties
)
81 result
= IOUserClient::clientHasPrivilege(current_task(),
82 kIOClientPrivilegeAdministrator
);
83 if (result
!= kIOReturnSuccess
) return kIOReturnNotPrivileged
;
85 theNumber
= OSDynamicCast(OSNumber
, properties
);
86 if (theNumber
== 0) return kIOReturnBadArgument
;
88 theValue
= theNumber
->unsigned32BitValue();
90 setProperty(kWatchDogEnabledProperty
, kOSBooleanFalse
);
92 setProperty(kWatchDogEnabledProperty
, kOSBooleanTrue
);
95 setWatchDogTimer(theValue
);
97 return kIOReturnSuccess
;
100 static IOReturn
IOWatchDogTimerSleepHandler(void *target
, void */
*refCon*/
,
102 IOService */
*provider*/
,
103 void *messageArgument
,
104 vm_size_t
/*argSize*/)
106 IOWatchDogTimer
*watchDogTimer
= (IOWatchDogTimer
*)target
;
107 sleepWakeNote
*swNote
= (sleepWakeNote
*)messageArgument
;
109 if (messageType
!= kIOMessageSystemWillSleep
) return kIOReturnUnsupported
;
111 watchDogTimer
->setProperty(kWatchDogEnabledProperty
, kOSBooleanFalse
);
112 watchDogTimer
->setWatchDogTimer(0);
114 swNote
->returnValue
= 0;
115 acknowledgeSleepWakeNotification(swNote
->powerRef
);
117 return kIOReturnSuccess
;