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);
55 IOWatchDogTimer::start(IOService
*provider
)
57 if (!super::start(provider
)) {
61 notifier
= registerSleepWakeInterest(IOWatchDogTimerSleepHandler
, this);
62 if (notifier
== NULL
) {
66 setProperty(kWatchDogEnabledProperty
, kOSBooleanFalse
);
75 IOWatchDogTimer::stop(IOService
*provider
)
82 IOWatchDogTimer::setProperties(OSObject
*properties
)
88 result
= IOUserClient::clientHasPrivilege(current_task(),
89 kIOClientPrivilegeAdministrator
);
90 if (result
!= kIOReturnSuccess
) {
91 return kIOReturnNotPrivileged
;
94 theNumber
= OSDynamicCast(OSNumber
, properties
);
95 if (theNumber
== NULL
) {
96 return kIOReturnBadArgument
;
99 theValue
= theNumber
->unsigned32BitValue();
101 setProperty(kWatchDogEnabledProperty
, kOSBooleanFalse
);
103 setProperty(kWatchDogEnabledProperty
, kOSBooleanTrue
);
106 setWatchDogTimer(theValue
);
108 return kIOReturnSuccess
;
112 IOWatchDogTimerSleepHandler(void *target
, void */
*refCon*/
,
114 IOService */
*provider*/
,
115 void *messageArgument
,
116 vm_size_t
/*argSize*/)
118 IOWatchDogTimer
*watchDogTimer
= (IOWatchDogTimer
*)target
;
119 sleepWakeNote
*swNote
= (sleepWakeNote
*)messageArgument
;
121 if (messageType
!= kIOMessageSystemWillSleep
) {
122 return kIOReturnUnsupported
;
125 watchDogTimer
->setProperty(kWatchDogEnabledProperty
, kOSBooleanFalse
);
126 watchDogTimer
->setWatchDogTimer(0);
128 swNote
->returnValue
= 0;
129 acknowledgeSleepWakeNotification(swNote
->powerRef
);
131 return kIOReturnSuccess
;