mirror of
https://gitlab.com/qemu-project/ipxe.git
synced 2025-11-03 07:59:06 +08:00
Compare commits
1 Commits
pxemenuscr
...
efi_watchd
| Author | SHA1 | Date | |
|---|---|---|---|
| 81e3351b9b |
@ -34,6 +34,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
#include <string.h>
|
||||
#include <ipxe/retry.h>
|
||||
#include <ipxe/timer.h>
|
||||
#include <ipxe/init.h>
|
||||
#include <ipxe/efi/efi.h>
|
||||
#include <ipxe/efi/efi_watchdog.h>
|
||||
|
||||
@ -80,3 +81,36 @@ static void efi_watchdog_expired ( struct retry_timer *timer,
|
||||
|
||||
/** Watchdog holdoff timer */
|
||||
struct retry_timer efi_watchdog = TIMER_INIT ( efi_watchdog_expired );
|
||||
|
||||
/**
|
||||
* Disable watching when shutting down to boot an operating system
|
||||
*
|
||||
* @v booting System is shutting down for OS boot
|
||||
*/
|
||||
static void efi_watchdog_shutdown ( int booting ) {
|
||||
EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
|
||||
EFI_STATUS efirc;
|
||||
int rc;
|
||||
|
||||
/* If we are shutting down to boot an operating system, then
|
||||
* disable the boot services watchdog timer. The UEFI
|
||||
* specification mandates that the platform firmware does this
|
||||
* as part of the ExitBootServices() call, but some platforms
|
||||
* (e.g. Hyper-V) are observed to occasionally forget to do
|
||||
* so, resulting in a reboot approximately five minutes after
|
||||
* starting the operating system.
|
||||
*/
|
||||
if ( booting &&
|
||||
( ( efirc = bs->SetWatchdogTimer ( 0, 0, 0, NULL ) ) != 0 ) ) {
|
||||
rc = -EEFI ( efirc );
|
||||
DBGC ( &efi_watchdog, "EFI could not disable watchdog timer: "
|
||||
"%s\n", strerror ( rc ) );
|
||||
/* Nothing we can do */
|
||||
}
|
||||
}
|
||||
|
||||
/** Watchdog startup/shutdown function */
|
||||
struct startup_fn efi_watchdog_startup_fn __startup_fn ( STARTUP_EARLY ) = {
|
||||
.name = "efi_watchdog",
|
||||
.shutdown = efi_watchdog_shutdown,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user