/*
* Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
*
- * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
+ * @APPLE_LICENSE_HEADER_START@
*
- * This file contains Original Code and/or Modifications of Original Code
- * as defined in and that are subject to the Apple Public Source License
- * Version 2.0 (the 'License'). You may not use this file except in
- * compliance with the License. The rights granted to you under the License
- * may not be used to create, or enable the creation or redistribution of,
- * unlawful or unlicensed copies of an Apple operating system, or to
- * circumvent, violate, or enable the circumvention or violation of, any
- * terms of an Apple operating system software license agreement.
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License"). You may not use this file except in compliance with the
+ * License. Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
*
- * Please obtain a copy of the License at
- * http://www.opensource.apple.com/apsl/ and read it before using this file.
- *
- * The Original Code and all software distributed under the License are
- * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
- * Please see the License for the specific language governing rights and
- * limitations under the License.
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
*
- * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
+ * @APPLE_LICENSE_HEADER_END@
*/
/*
* HISTORY
#include <pexpert/pexpert.h>
}
-/* Delay period for UPS halt */
-#define kUPSDelayHaltCPU_msec (1000*60*5)
-
void printDictionaryKeys (OSDictionary * inDictionary, char * inMsg);
static void getCStringForObject (OSObject * inObj, char * outStr);
int IOPlatformExpert::haltRestart(unsigned int type)
{
- if (type == kPEHangCPU) while (1);
-
- if (type == kPEUPSDelayHaltCPU) {
- // Stall shutdown for 5 minutes, and if no outside force has
- // removed our power at that point, proceed with a reboot.
- IOSleep( kUPSDelayHaltCPU_msec );
+ IOPMrootDomain *rd = getPMRootDomain();
+ OSBoolean *b = 0;
+
+ if(rd) b = (OSBoolean *)OSDynamicCast(OSBoolean, rd->getProperty(OSString::withCString("StallSystemAtHalt")));
- // Ideally we never reach this point.
+ if (type == kPEHangCPU) while (1);
+ if (kOSBooleanTrue == b) {
+ // Stall shutdown for 5 minutes, and if no outside force has removed our power, continue with
+ // a reboot.
+ IOSleep(1000*60*5);
type = kPERestartCPU;
}
- kprintf("platform halt restart\n");
+
if (PE_halt_restart) return (*PE_halt_restart)(type);
else return -1;
}
}
}
-/* IOShutdownNotificationsTimedOut
+/* IOPMPanicOnShutdownHang
* - Called from a timer installed by PEHaltRestart
*/
-static void IOShutdownNotificationsTimedOut(
- thread_call_param_t p0,
- thread_call_param_t p1)
+static void IOPMPanicOnShutdownHang(thread_call_param_t p0, thread_call_param_t p1)
{
int type = (int)p0;
/* 30 seconds has elapsed - resume shutdown */
- if(gIOPlatform) gIOPlatform->haltRestart(type);
+ gIOPlatform->haltRestart(type);
}
bool noWaitForResponses;
AbsoluteTime deadline;
thread_call_t shutdown_hang;
- unsigned int tell_type;
- if(type == kPEHaltCPU || type == kPERestartCPU || type == kPEUPSDelayHaltCPU)
+ if(type == kPEHaltCPU || type == kPERestartCPU)
{
/* Notify IOKit PM clients of shutdown/restart
Clients subscribe to this message with a call to
If all goes well the machine will be off by the time
the timer expires.
*/
- shutdown_hang = thread_call_allocate( &IOShutdownNotificationsTimedOut,
- (thread_call_param_t) type);
+ shutdown_hang = thread_call_allocate( &IOPMPanicOnShutdownHang, (thread_call_param_t) type);
clock_interval_to_deadline( 30, kSecondScale, &deadline );
thread_call_enter1_delayed( shutdown_hang, 0, deadline );
-
- if( kPEUPSDelayHaltCPU == type ) {
- tell_type = kPEHaltCPU;
- } else {
- tell_type = type;
- }
-
- noWaitForResponses = pmRootDomain->tellChangeDown2(tell_type);
+ noWaitForResponses = pmRootDomain->tellChangeDown2(type);
/* This notification should have few clients who all do
their work synchronously.
long PEGetGMTTimeOfDay(void)
{
- long result = 0;
-
if( gIOPlatform)
- result = gIOPlatform->getGMTTimeOfDay();
-
- return (result);
+ return( gIOPlatform->getGMTTimeOfDay());
+ else
+ return( 0 );
}
void PESetGMTTimeOfDay(long secs)
{
if( gIOPlatform)
- gIOPlatform->setGMTTimeOfDay(secs);
+ gIOPlatform->setGMTTimeOfDay(secs);
}
} /* extern "C" */
workLoop->release();
}
-bool IOPlatformExpertDevice::attachToChild( IORegistryEntry * child,
- const IORegistryPlane * plane )
-{
- return IOService::attachToChild( child, plane );
-}
-
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#undef super