From 521006d9390d47a214407e638704b32c60ec6768 Mon Sep 17 00:00:00 2001 From: Rafal Kupiec Date: Fri, 12 Jan 2024 15:59:38 +0100 Subject: [PATCH] Implement BlRebootSystem() and BlShutdownSystem() routines --- sdk/xtdk/bltypes.h | 3 +++ xtldr/efiutils.c | 30 ++++++++++++++++++++++++++++++ xtldr/protocol.c | 2 ++ 3 files changed, 35 insertions(+) diff --git a/sdk/xtdk/bltypes.h b/sdk/xtdk/bltypes.h index 0817d286..3d27fe43 100644 --- a/sdk/xtdk/bltypes.h +++ b/sdk/xtdk/bltypes.h @@ -98,6 +98,7 @@ typedef EFI_STATUS (*PBL_LOCATE_PROTOCOL_HANDLES)(OUT PEFI_HANDLE *Handles, OUT typedef EFI_STATUS (*PBL_OPEN_VOLUME)(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath, OUT PEFI_HANDLE DiskHandle, OUT PEFI_FILE_HANDLE *FsHandle); typedef EFI_STATUS (*PBL_OPEN_PROTOCOL)(OUT PEFI_HANDLE Handle, OUT PVOID *ProtocolHandler, IN PEFI_GUID ProtocolGuid); typedef EFI_STATUS (*PBL_OPEN_PROTOCOL_HANDLE)(IN EFI_HANDLE Handle, OUT PVOID *ProtocolHandler, IN PEFI_GUID ProtocolGuid); +typedef EFI_STATUS (*PBL_POWER_SYSTEM)(); typedef EFI_STATUS (*PBL_READ_FILE)(IN PEFI_FILE_HANDLE DirHandle, IN CONST PWCHAR FileName, OUT PVOID *FileData, OUT PSIZE_T FileSize); typedef EFI_STATUS (*PBL_REGISTER_BOOT_PROTOCOL)(IN PWCHAR SystemType, IN PEFI_GUID BootProtocolGuid); typedef VOID (*PBL_REGISTER_XT_BOOT_MENU)(PVOID BootMenuRoutine); @@ -291,6 +292,8 @@ typedef struct _XTBL_LOADER_PROTOCOL { PBL_EXIT_BOOT_SERVICES ExitBootServices; PBL_GET_SECURE_BOOT_STATUS GetSecureBootStatus; + PBL_POWER_SYSTEM RebootSystem; + PBL_POWER_SYSTEM ShutdownSystem; PBL_SLEEP_EXECUTION SleepExecution; PBL_WAIT_FOR_EFI_EVENT WaitForEfiEvent; } Util; diff --git a/xtldr/efiutils.c b/xtldr/efiutils.c index f1d0ab02..84618dd6 100644 --- a/xtldr/efiutils.c +++ b/xtldr/efiutils.c @@ -99,6 +99,36 @@ BlGetSecureBootStatus() return SecureBootStatus; } +/** + * Reboots the machine. + * + * @return This routine returns a status code. + * + * @since XT 1.0 + */ +XTCDECL +EFI_STATUS +BlRebootSystem() +{ + /* Reboot machine */ + return EfiSystemTable->RuntimeServices->ResetSystem(EfiResetCold, STATUS_EFI_SUCCESS, 0, NULL); +} + +/** + * Shuts down the machine. + * + * @return This routine returns a status code. + * + * @since XT 1.0 + */ +XTCDECL +EFI_STATUS +BlShutdownSystem() +{ + /* Shutdown machine */ + return EfiSystemTable->RuntimeServices->ResetSystem(EfiResetShutdown, STATUS_EFI_SUCCESS, 0, NULL); +} + /** * Puts the system to sleep for the specified number of milliseconds. * diff --git a/xtldr/protocol.c b/xtldr/protocol.c index 70e8c2ca..c135e60d 100644 --- a/xtldr/protocol.c +++ b/xtldr/protocol.c @@ -646,6 +646,8 @@ BlpInstallXtLoaderProtocol() BlpLdrProtocol.Tui.UpdateProgressBar = BlUpdateProgressBar; BlpLdrProtocol.Util.ExitBootServices = BlExitBootServices; BlpLdrProtocol.Util.GetSecureBootStatus = BlGetSecureBootStatus; + BlpLdrProtocol.Util.RebootSystem = BlRebootSystem; + BlpLdrProtocol.Util.ShutdownSystem = BlShutdownSystem; BlpLdrProtocol.Util.SleepExecution = BlSleepExecution; BlpLdrProtocol.Util.WaitForEfiEvent = BlWaitForEfiEvent;