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 <string.h>
 | 
				
			||||||
#include <ipxe/retry.h>
 | 
					#include <ipxe/retry.h>
 | 
				
			||||||
#include <ipxe/timer.h>
 | 
					#include <ipxe/timer.h>
 | 
				
			||||||
 | 
					#include <ipxe/init.h>
 | 
				
			||||||
#include <ipxe/efi/efi.h>
 | 
					#include <ipxe/efi/efi.h>
 | 
				
			||||||
#include <ipxe/efi/efi_watchdog.h>
 | 
					#include <ipxe/efi/efi_watchdog.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -80,3 +81,36 @@ static void efi_watchdog_expired ( struct retry_timer *timer,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/** Watchdog holdoff timer */
 | 
					/** Watchdog holdoff timer */
 | 
				
			||||||
struct retry_timer efi_watchdog = TIMER_INIT ( efi_watchdog_expired );
 | 
					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