2008-04-09 09:07:50 +02:00
|
|
|
/** @file
|
|
|
|
|
|
|
|
UEFI Miscellaneous boot Services SetWatchdogTimer service implementation
|
2007-07-04 12:51:54 +02:00
|
|
|
|
2008-04-09 09:07:50 +02:00
|
|
|
Copyright (c) 2006 - 2008, Intel Corporation
|
2007-07-04 12:51:54 +02:00
|
|
|
All rights reserved. This program and the accompanying materials
|
|
|
|
are licensed and made available under the terms and conditions of the BSD License
|
|
|
|
which accompanies this distribution. The full text of the license may be found at
|
|
|
|
http://opensource.org/licenses/bsd-license.php
|
|
|
|
|
|
|
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
|
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
|
|
|
2008-04-09 09:07:50 +02:00
|
|
|
**/
|
2007-07-04 12:51:54 +02:00
|
|
|
|
|
|
|
#include <DxeMain.h>
|
|
|
|
|
|
|
|
#define WATCHDOG_TIMER_CALIBRATE_PER_SECOND 10000000
|
|
|
|
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
EFIAPI
|
|
|
|
CoreSetWatchdogTimer (
|
|
|
|
IN UINTN Timeout,
|
|
|
|
IN UINT64 WatchdogCode,
|
|
|
|
IN UINTN DataSize,
|
|
|
|
IN CHAR16 *WatchdogData OPTIONAL
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Sets the system's watchdog timer.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
Timeout The number of seconds. Zero disables the timer.
|
|
|
|
|
|
|
|
///////following three parameters are left for platform specific using
|
|
|
|
|
|
|
|
WatchdogCode The numberic code to log. 0x0 to 0xffff are firmware
|
|
|
|
DataSize Size of the optional data
|
|
|
|
WatchdogData Optional Null terminated unicode string followed by binary
|
|
|
|
data.
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
EFI_SUCCESS Timeout has been set
|
|
|
|
EFI_NOT_AVAILABLE_YET WatchdogTimer is not available yet
|
|
|
|
EFI_UNSUPPORTED System does not have a timer (currently not used)
|
|
|
|
EFI_DEVICE_ERROR Could not complete due to hardware error
|
|
|
|
|
|
|
|
--*/
|
|
|
|
{
|
|
|
|
EFI_STATUS Status;
|
|
|
|
|
|
|
|
//
|
|
|
|
// Check our architectural protocol
|
|
|
|
//
|
|
|
|
if (gWatchdogTimer == NULL) {
|
|
|
|
return EFI_NOT_AVAILABLE_YET;
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// Attempt to set the timeout
|
|
|
|
//
|
|
|
|
Status = gWatchdogTimer->SetTimerPeriod (gWatchdogTimer, MultU64x32 (Timeout, WATCHDOG_TIMER_CALIBRATE_PER_SECOND));
|
|
|
|
|
|
|
|
//
|
|
|
|
// Check for errors
|
|
|
|
//
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
return EFI_DEVICE_ERROR;
|
|
|
|
}
|
|
|
|
|
|
|
|
return EFI_SUCCESS;
|
|
|
|
}
|