Implement BlLoadEfiImage() and BlStartEfiImage() routines
This commit is contained in:
parent
6733e092ba
commit
435ee66ce1
@ -82,6 +82,7 @@ typedef VOID (*PBL_INITIALIZE_PAGE_MAP)(OUT PXTBL_PAGE_MAPPING PageMap, IN SHORT
|
|||||||
typedef EFI_STATUS (*PBL_INSTALL_XT_PROTOCOL)(IN PVOID Interface, IN PEFI_GUID Guid);
|
typedef EFI_STATUS (*PBL_INSTALL_XT_PROTOCOL)(IN PVOID Interface, IN PEFI_GUID Guid);
|
||||||
typedef EFI_STATUS (*PBL_INVOKE_BOOT_PROTOCOL)(IN PLIST_ENTRY OptionsList);
|
typedef EFI_STATUS (*PBL_INVOKE_BOOT_PROTOCOL)(IN PLIST_ENTRY OptionsList);
|
||||||
typedef EFI_STATUS (*PBL_LOCATE_PROTOCOL_HANDLES)(OUT PEFI_HANDLE *Handles, OUT PUINT_PTR Count, IN PEFI_GUID ProtocolGuid);
|
typedef EFI_STATUS (*PBL_LOCATE_PROTOCOL_HANDLES)(OUT PEFI_HANDLE *Handles, OUT PUINT_PTR Count, IN PEFI_GUID ProtocolGuid);
|
||||||
|
typedef EFI_STATUS (*PBL_LOAD_EFI_IMAGE)(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath, IN PVOID ImageData, IN SIZE_T ImageSize, OUT PEFI_HANDLE ImageHandle);
|
||||||
typedef EFI_STATUS (*PBL_MAP_EFI_MEMORY)(IN OUT PXTBL_PAGE_MAPPING PageMap, IN OUT PVOID *MemoryMapAddress);
|
typedef EFI_STATUS (*PBL_MAP_EFI_MEMORY)(IN OUT PXTBL_PAGE_MAPPING PageMap, IN OUT PVOID *MemoryMapAddress);
|
||||||
typedef EFI_STATUS (*PBL_MAP_PAGE)(IN PXTBL_PAGE_MAPPING PageMap, IN UINT_PTR VirtualAddress, IN UINT_PTR PhysicalAddress, IN UINT NumberOfPages);
|
typedef EFI_STATUS (*PBL_MAP_PAGE)(IN PXTBL_PAGE_MAPPING PageMap, IN UINT_PTR VirtualAddress, IN UINT_PTR PhysicalAddress, IN UINT NumberOfPages);
|
||||||
typedef EFI_STATUS (*PBL_MAP_VIRTUAL_MEMORY)(IN OUT PXTBL_PAGE_MAPPING PageMap, IN PVOID VirtualAddress, IN PVOID PhysicalAddress, IN UINT NumberOfPages, IN LOADER_MEMORY_TYPE MemoryType);
|
typedef EFI_STATUS (*PBL_MAP_VIRTUAL_MEMORY)(IN OUT PXTBL_PAGE_MAPPING PageMap, IN PVOID VirtualAddress, IN PVOID PhysicalAddress, IN UINT NumberOfPages, IN LOADER_MEMORY_TYPE MemoryType);
|
||||||
@ -94,6 +95,7 @@ typedef EFI_STATUS (*PBL_REGISTER_BOOT_PROTOCOL)(IN PWCHAR SystemType, IN PEFI_G
|
|||||||
typedef VOID (*PBL_REGISTER_XT_BOOT_MENU)(PVOID BootMenuRoutine);
|
typedef VOID (*PBL_REGISTER_XT_BOOT_MENU)(PVOID BootMenuRoutine);
|
||||||
typedef VOID (XTAPI *PBL_SET_MEMORY)(OUT PVOID Destination, IN UCHAR Byte, IN SIZE_T Length);
|
typedef VOID (XTAPI *PBL_SET_MEMORY)(OUT PVOID Destination, IN UCHAR Byte, IN SIZE_T Length);
|
||||||
typedef VOID (*PBL_SLEEP_EXECUTION)(IN ULONG_PTR Milliseconds);
|
typedef VOID (*PBL_SLEEP_EXECUTION)(IN ULONG_PTR Milliseconds);
|
||||||
|
typedef EFI_STATUS (*PBL_START_EFI_IMAGE)(IN EFI_HANDLE ImageHandle);
|
||||||
typedef VOID (*PBL_TUI_DISPLAY_ERROR_DIALOG)(IN PWCHAR Caption, IN PWCHAR Message);
|
typedef VOID (*PBL_TUI_DISPLAY_ERROR_DIALOG)(IN PWCHAR Caption, IN PWCHAR Message);
|
||||||
typedef VOID (*PBL_TUI_DISPLAY_INFO_DIALOG)(IN PWCHAR Caption, IN PWCHAR Message);
|
typedef VOID (*PBL_TUI_DISPLAY_INFO_DIALOG)(IN PWCHAR Caption, IN PWCHAR Message);
|
||||||
typedef VOID (*PBL_TUI_DISPLAY_INPUT_DIALOG)(IN PWCHAR Caption, IN PWCHAR Message, IN PWCHAR *InputFieldText);
|
typedef VOID (*PBL_TUI_DISPLAY_INPUT_DIALOG)(IN PWCHAR Caption, IN PWCHAR Message, IN PWCHAR *InputFieldText);
|
||||||
@ -298,9 +300,11 @@ typedef struct _XTBL_LOADER_PROTOCOL
|
|||||||
{
|
{
|
||||||
PBL_EXIT_BOOT_SERVICES ExitBootServices;
|
PBL_EXIT_BOOT_SERVICES ExitBootServices;
|
||||||
PBL_GET_SECURE_BOOT_STATUS GetSecureBootStatus;
|
PBL_GET_SECURE_BOOT_STATUS GetSecureBootStatus;
|
||||||
|
PBL_LOAD_EFI_IMAGE LoadEfiImage;
|
||||||
PBL_POWER_SYSTEM RebootSystem;
|
PBL_POWER_SYSTEM RebootSystem;
|
||||||
PBL_POWER_SYSTEM ShutdownSystem;
|
PBL_POWER_SYSTEM ShutdownSystem;
|
||||||
PBL_SLEEP_EXECUTION SleepExecution;
|
PBL_SLEEP_EXECUTION SleepExecution;
|
||||||
|
PBL_START_EFI_IMAGE StartEfiImage;
|
||||||
PBL_WAIT_FOR_EFI_EVENT WaitForEfiEvent;
|
PBL_WAIT_FOR_EFI_EVENT WaitForEfiEvent;
|
||||||
} Util;
|
} Util;
|
||||||
} XTBL_LOADER_PROTOCOL, *PXTBL_LOADER_PROTOCOL;
|
} XTBL_LOADER_PROTOCOL, *PXTBL_LOADER_PROTOCOL;
|
||||||
|
@ -99,6 +99,36 @@ BlGetSecureBootStatus()
|
|||||||
return SecureBootStatus;
|
return SecureBootStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads an EFI image into memory.
|
||||||
|
*
|
||||||
|
* @param DevicePath
|
||||||
|
* Specifies a device path from which the image is loaded.
|
||||||
|
*
|
||||||
|
* @param ImageData
|
||||||
|
* Supplies a pointer to the memory are containing a copy of the EFI image.
|
||||||
|
*
|
||||||
|
* @param ImageSize
|
||||||
|
* Supplies the size (in bytes) of the EFI image.
|
||||||
|
*
|
||||||
|
* @param ImageHandle
|
||||||
|
* Supplies a pointer to the memory area, where an EFI_image handle will be stored.
|
||||||
|
*
|
||||||
|
* @return This routine returns a status code.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTCDECL
|
||||||
|
EFI_STATUS
|
||||||
|
BlLoadEfiImage(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath,
|
||||||
|
IN PVOID ImageData,
|
||||||
|
IN SIZE_T ImageSize,
|
||||||
|
OUT PEFI_HANDLE ImageHandle)
|
||||||
|
{
|
||||||
|
/* Load EFI image */
|
||||||
|
return EfiSystemTable->BootServices->LoadImage(FALSE, EfiImageHandle, DevicePath, ImageData, ImageSize, ImageHandle);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reboots the machine.
|
* Reboots the machine.
|
||||||
*
|
*
|
||||||
@ -146,6 +176,23 @@ BlSleepExecution(IN ULONG_PTR Milliseconds)
|
|||||||
EfiSystemTable->BootServices->Stall(Milliseconds * 1000);
|
EfiSystemTable->BootServices->Stall(Milliseconds * 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Executes a loaded EFI image entry point.
|
||||||
|
*
|
||||||
|
* @param ImageHandle
|
||||||
|
* Provides a handle of loaded image, that will be started.
|
||||||
|
*
|
||||||
|
* @return This routine returns a status code.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTCDECL
|
||||||
|
EFI_STATUS
|
||||||
|
BlStartEfiImage(IN EFI_HANDLE ImageHandle)
|
||||||
|
{
|
||||||
|
return EfiSystemTable->BootServices->StartImage(ImageHandle, NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Waits for one or more EFI events.
|
* Waits for one or more EFI events.
|
||||||
*
|
*
|
||||||
|
@ -178,6 +178,13 @@ XTCDECL
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
BlInvokeBootProtocol(IN PLIST_ENTRY OptionsList);
|
BlInvokeBootProtocol(IN PLIST_ENTRY OptionsList);
|
||||||
|
|
||||||
|
XTCDECL
|
||||||
|
EFI_STATUS
|
||||||
|
BlLoadEfiImage(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath,
|
||||||
|
IN PVOID ImageData,
|
||||||
|
IN SIZE_T ImageSize,
|
||||||
|
OUT PEFI_HANDLE ImageHandle);
|
||||||
|
|
||||||
XTCDECL
|
XTCDECL
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
BlLoadModule(IN PWCHAR ModuleName);
|
BlLoadModule(IN PWCHAR ModuleName);
|
||||||
@ -289,6 +296,10 @@ XTCDECL
|
|||||||
VOID
|
VOID
|
||||||
BlSleepExecution(IN ULONG_PTR Milliseconds);
|
BlSleepExecution(IN ULONG_PTR Milliseconds);
|
||||||
|
|
||||||
|
XTCDECL
|
||||||
|
EFI_STATUS
|
||||||
|
BlStartEfiImage(IN EFI_HANDLE ImageHandle);
|
||||||
|
|
||||||
XTCDECL
|
XTCDECL
|
||||||
VOID
|
VOID
|
||||||
BlStartLoaderShell();
|
BlStartLoaderShell();
|
||||||
|
@ -287,8 +287,7 @@ BlLoadModule(IN PWCHAR ModuleName)
|
|||||||
ModuleDevicePath[1].Header.SubType = EFI_END_ENTIRE_DP;
|
ModuleDevicePath[1].Header.SubType = EFI_END_ENTIRE_DP;
|
||||||
|
|
||||||
/* Load EFI image */
|
/* Load EFI image */
|
||||||
Status = EfiSystemTable->BootServices->LoadImage(FALSE, EfiImageHandle, (PEFI_DEVICE_PATH_PROTOCOL)ModuleDevicePath,
|
Status = BlLoadEfiImage((PEFI_DEVICE_PATH_PROTOCOL)ModuleDevicePath, ModuleData, ModuleSize, &ModuleHandle);
|
||||||
ModuleData, ModuleSize, &ModuleHandle);
|
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
{
|
{
|
||||||
/* Check if caused by secure boot */
|
/* Check if caused by secure boot */
|
||||||
@ -337,7 +336,7 @@ BlLoadModule(IN PWCHAR ModuleName)
|
|||||||
EfiSystemTable->BootServices->CloseProtocol(LoadedImage, &LIPGuid, LoadedImage, NULL);
|
EfiSystemTable->BootServices->CloseProtocol(LoadedImage, &LIPGuid, LoadedImage, NULL);
|
||||||
|
|
||||||
/* Start EFI image */
|
/* Start EFI image */
|
||||||
Status = EfiSystemTable->BootServices->StartImage(ModuleHandle, NULL, NULL);
|
Status = BlStartEfiImage(ModuleHandle);
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
{
|
{
|
||||||
/* Failed to start module image */
|
/* Failed to start module image */
|
||||||
@ -651,9 +650,11 @@ BlpInstallXtLoaderProtocol()
|
|||||||
BlpLdrProtocol.Tui.UpdateProgressBar = BlUpdateProgressBar;
|
BlpLdrProtocol.Tui.UpdateProgressBar = BlUpdateProgressBar;
|
||||||
BlpLdrProtocol.Util.ExitBootServices = BlExitBootServices;
|
BlpLdrProtocol.Util.ExitBootServices = BlExitBootServices;
|
||||||
BlpLdrProtocol.Util.GetSecureBootStatus = BlGetSecureBootStatus;
|
BlpLdrProtocol.Util.GetSecureBootStatus = BlGetSecureBootStatus;
|
||||||
|
BlpLdrProtocol.Util.LoadEfiImage = BlLoadEfiImage;
|
||||||
BlpLdrProtocol.Util.RebootSystem = BlRebootSystem;
|
BlpLdrProtocol.Util.RebootSystem = BlRebootSystem;
|
||||||
BlpLdrProtocol.Util.ShutdownSystem = BlShutdownSystem;
|
BlpLdrProtocol.Util.ShutdownSystem = BlShutdownSystem;
|
||||||
BlpLdrProtocol.Util.SleepExecution = BlSleepExecution;
|
BlpLdrProtocol.Util.SleepExecution = BlSleepExecution;
|
||||||
|
BlpLdrProtocol.Util.StartEfiImage = BlStartEfiImage;
|
||||||
BlpLdrProtocol.Util.WaitForEfiEvent = BlWaitForEfiEvent;
|
BlpLdrProtocol.Util.WaitForEfiEvent = BlWaitForEfiEvent;
|
||||||
|
|
||||||
/* Register XTLDR loader protocol */
|
/* Register XTLDR loader protocol */
|
||||||
|
Loading…
Reference in New Issue
Block a user