Improvements to protocol support
All checks were successful
Builds / ExectOS (amd64) (push) Successful in 29s
Builds / ExectOS (i686) (push) Successful in 28s

This commit is contained in:
2024-01-08 16:13:18 +01:00
parent 87a586ed68
commit 17c0fdecce
8 changed files with 88 additions and 44 deletions

View File

@@ -174,7 +174,8 @@ BlOpenVolume(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath,
XTCDECL
EFI_STATUS
BlOpenProtocol(OUT PVOID *ProtocolHandler,
BlOpenProtocol(OUT PEFI_HANDLE Handle,
OUT PVOID *ProtocolHandler,
IN PEFI_GUID ProtocolGuid);
XTCDECL
@@ -204,8 +205,8 @@ BlRegisterBootProtocol(IN PWCHAR SystemType,
XTCDECL
EFI_STATUS
BlInstallProtocol(IN PEFI_GUID Guid,
IN PVOID Interface);
BlInstallProtocol(IN PVOID Interface,
IN PEFI_GUID Guid);
XTCDECL
VOID

View File

@@ -56,5 +56,5 @@ XtLdrModuleMain(IN EFI_HANDLE ImageHandle,
XtLdrProto->Boot.RegisterProtocol(L"XTOS", &DummyGuid);
/* Register DUMMY protocol as XTOS boot protocol */
return XtLdrProto->Protocol.Install(&DummyGuid, &BlpDummyProtocol);
return XtLdrProto->Protocol.Install(&BlpDummyProtocol, &DummyGuid);
}

View File

@@ -88,6 +88,7 @@ FbInitializeDisplay()
EFI_GUID GopGuid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID;
EFI_GUID UgaGuid = EFI_UNIVERSAL_GRAPHICS_ADAPTER_PROTOCOL_GUID;
UINT32 Parameter1, Parameter2;
EFI_HANDLE Handle;
EFI_STATUS Status;
/* Check if framebuffer already initialized */
@@ -99,7 +100,7 @@ FbInitializeDisplay()
FrameBufferInfo.Initialized = FALSE;
/* Attempt to open GOP protocol */
Status = XtLdrProtocol->Protocol.Open((PVOID*)&FrameBufferInfo.Adapter.GOP, &GopGuid);
Status = XtLdrProtocol->Protocol.Open(&Handle, (PVOID*)&FrameBufferInfo.Adapter.GOP, &GopGuid);
/* Check if Graphics Output Protocol is available */
if(Status == STATUS_EFI_SUCCESS)
@@ -119,6 +120,9 @@ FbInitializeDisplay()
FrameBufferInfo.FrameBufferSize = FrameBufferInfo.Adapter.GOP->Mode->FrameBufferSize;
FrameBufferInfo.Protocol = GOP;
FrameBufferInfo.Initialized = TRUE;
/* Close GOP protocol */
Status = XtLdrProtocol->Protocol.Close(Handle, &GopGuid);
}
else
{
@@ -126,7 +130,7 @@ FbInitializeDisplay()
FrameBufferInfo.Adapter.GOP = NULL;
/* Attempt to open UGA protocol */
Status = XtLdrProtocol->Protocol.Open((PVOID*)&FrameBufferInfo.Adapter.UGA, &UgaGuid);
Status = XtLdrProtocol->Protocol.Open(&Handle, (PVOID*)&FrameBufferInfo.Adapter.UGA, &UgaGuid);
/* Check if Universal Graphics Adapter is available */
if(Status == STATUS_EFI_SUCCESS)
@@ -162,6 +166,9 @@ FbInitializeDisplay()
/* Temporarily set this to FALSE, as we don't set FB base and we cannot use it anyway */
FrameBufferInfo.Initialized = FALSE;
}
/* Close UGA protocol */
XtLdrProtocol->Protocol.Close(Handle, &UgaGuid);
}
}
@@ -251,5 +258,5 @@ XtLdrModuleMain(IN EFI_HANDLE ImageHandle,
XtFramebufferProtocol.PrintDisplayInformation = FbPrintDisplayInformation;
/* Register XTOS boot protocol */
return XtLdrProtocol->Protocol.Install(&Guid, &XtFramebufferProtocol);
return XtLdrProtocol->Protocol.Install(&XtFramebufferProtocol, &Guid);
}

View File

@@ -603,5 +603,5 @@ XtLdrModuleMain(IN EFI_HANDLE ImageHandle,
XtPeCoffProtocol.RelocateImage = PeRelocateImage;
/* Register PE/COFF protocol */
return XtLdrProtocol->Protocol.Install(&Guid, &XtPeCoffProtocol);
return XtLdrProtocol->Protocol.Install(&XtPeCoffProtocol, &Guid);
}

View File

@@ -40,7 +40,7 @@ EFI_STATUS
XtBootSystem(IN PXTBL_BOOT_PARAMETERS Parameters)
{
EFI_GUID PeCoffProtocolGuid = XT_PECOFF_IMAGE_PROTOCOL_GUID;
EFI_HANDLE DiskHandle;
EFI_HANDLE DiskHandle, ProtocolHandle;
PEFI_FILE_HANDLE FsHandle, BootDir;
PWCHAR SystemPath;
EFI_STATUS Status;
@@ -49,7 +49,7 @@ XtBootSystem(IN PXTBL_BOOT_PARAMETERS Parameters)
XtLdrProtocol->Debug.Print(L"XTOS boot protocol activated\n");
/* Open the XT PE/COFF protocol */
Status = XtLdrProtocol->Protocol.Open((PVOID *)&XtPeCoffProtocol, &PeCoffProtocolGuid);
Status = XtLdrProtocol->Protocol.Open(&ProtocolHandle, (PVOID *)&XtPeCoffProtocol, &PeCoffProtocolGuid);
if(Status != STATUS_EFI_SUCCESS)
{
/* Failed to open loader protocol */
@@ -183,6 +183,7 @@ XtpBootSequence(IN PEFI_FILE_HANDLE BootDir,
PVOID VirtualAddress, VirtualMemoryArea;
PXT_ENTRY_POINT KernelEntryPoint;
LIST_ENTRY MemoryMappings;
EFI_HANDLE ProtocolHandle;
EFI_STATUS Status;
/* Initialize XTOS startup sequence */
@@ -250,7 +251,7 @@ XtpBootSequence(IN PEFI_FILE_HANDLE BootDir,
BootDir->Close(BootDir);
/* Enable paging */
XtLdrProtocol->Protocol.Open((PVOID*)&ImageProtocol, &LoadedImageGuid);
XtLdrProtocol->Protocol.Open(&ProtocolHandle, (PVOID*)&ImageProtocol, &LoadedImageGuid);
Status = XtEnablePaging(&MemoryMappings, VirtualAddress, ImageProtocol, &XtPageMap);
if(Status != STATUS_EFI_SUCCESS)
{
@@ -333,6 +334,7 @@ XtpInitializeLoaderBlock(IN PLIST_ENTRY MemoryMappings,
EFI_PHYSICAL_ADDRESS Address;
// PVOID RuntimeServices;
EFI_STATUS Status;
EFI_HANDLE ProtocolHandle;
UINT BlockPages, FrameBufferPages;
/* Calculate number of pages needed for initialization block */
@@ -359,7 +361,7 @@ XtpInitializeLoaderBlock(IN PLIST_ENTRY MemoryMappings,
LoaderBlock->LoaderInformation.DbgPrint = XtLdrProtocol->Debug.Print;
/* Load FrameBuffer protocol */
Status = XtLdrProtocol->Protocol.Open((PVOID*)&FrameBufProtocol, &FrameBufGuid);
Status = XtLdrProtocol->Protocol.Open(&ProtocolHandle, (PVOID*)&FrameBufProtocol, &FrameBufGuid);
if(Status == STATUS_EFI_SUCCESS)
{
/* Make sure FrameBuffer is initialized */
@@ -375,6 +377,9 @@ XtpInitializeLoaderBlock(IN PLIST_ENTRY MemoryMappings,
LoaderBlock->LoaderInformation.FrameBuffer.Protocol = NONE;
}
/* Close FrameBuffer protocol */
XtLdrProtocol->Protocol.Close(ProtocolHandle, &FrameBufGuid);
/* Attempt to find virtual address of the EFI Runtime Services */
// Status = XtLdrProtocol->GetVirtualAddress(MemoryMappings, &EfiSystemTable->RuntimeServices->Hdr, &RuntimeServices);
// if(Status == STATUS_EFI_SUCCESS)
@@ -542,5 +547,5 @@ XtLdrModuleMain(IN EFI_HANDLE ImageHandle,
XtLdrProtocol->Boot.RegisterProtocol(L"XTOS", &Guid);
/* Install XTOS protocol */
return XtLdrProtocol->Protocol.Install(&Guid, &XtBootProtocol);
return XtLdrProtocol->Protocol.Install(&XtBootProtocol, &Guid);
}

View File

@@ -9,6 +9,27 @@
#include <xtldr.h>
/**
* Closes a protocol on a provided handle.
*
* @param Handle
* Supplies a handle for the protocol interface that was previously opened.
*
* @param ProtocolGuid
* Supplies a unique protocol GUID.
*
* @return This routine returns a status code.
*
* @since XT 1.0
*/
XTCDECL
EFI_STATUS
BlCloseProtocol(IN PEFI_HANDLE Handle,
IN PEFI_GUID ProtocolGuid)
{
return EfiSystemTable->BootServices->CloseProtocol(Handle, ProtocolGuid, EfiImageHandle, NULL);
}
/**
* Finds a boot protocol for specified system type.
*
@@ -69,6 +90,30 @@ BlGetModulesList()
return &BlpLoadedModules;
}
/**
* Installs XTLDR protocol interface.
*
* @param Guid
* Specifies a unique protocol GUID.
*
* @param Interface
* Supplies a pointer to the protocol interface, or NULL if there is no structure associated.
*
* @return This routine returns a status code.
*
* @since XT 1.0
*/
XTCDECL
EFI_STATUS
BlInstallProtocol(IN PVOID Interface,
IN PEFI_GUID Guid)
{
EFI_HANDLE Handle = NULL;
/* Install protocol interface */
return EfiSystemTable->BootServices->InstallProtocolInterface(&Handle, Guid, EFI_NATIVE_INTERFACE, Interface);
}
/**
* Loads a specified XTLDR module from disk.
*
@@ -355,6 +400,9 @@ BlLoadModules(IN PWCHAR ModulesList)
/**
* This routine locates and opens the requested XT Boot Loader or EFI protocol.
*
* @param Handle
* Supplies the address where a pointer to the handle for the protocol interface.
*
* @param ProtocolHandler
* Supplies the address where a pointer to the opened protocol is returned.
*
@@ -367,7 +415,8 @@ BlLoadModules(IN PWCHAR ModulesList)
*/
XTCDECL
EFI_STATUS
BlOpenProtocol(OUT PVOID *ProtocolHandler,
BlOpenProtocol(OUT PEFI_HANDLE Handle,
OUT PVOID *ProtocolHandler,
IN PEFI_GUID ProtocolGuid)
{
PEFI_HANDLE Handles = NULL;
@@ -398,6 +447,7 @@ BlOpenProtocol(OUT PVOID *ProtocolHandler,
if(Status == STATUS_EFI_SUCCESS)
{
/* Protocol found and successfully opened */
*Handle = Handles[Index];
break;
}
}
@@ -491,30 +541,6 @@ BlRegisterBootProtocol(IN PWCHAR SystemType,
return STATUS_EFI_SUCCESS;
}
/**
* Installs XTLDR protocol interface.
*
* @param Guid
* Specifies a unique protocol GUID.
*
* @param Interface
* Supplies a pointer to the protocol interface, or NULL if there is no structure associated.
*
* @return This routine returns a status code.
*
* @since XT 1.0
*/
XTCDECL
EFI_STATUS
BlInstallProtocol(IN PEFI_GUID Guid,
IN PVOID Interface)
{
EFI_HANDLE Handle = NULL;
/* Install protocol interface */
return EfiSystemTable->BootServices->InstallProtocolInterface(&Handle, Guid, EFI_NATIVE_INTERFACE, Interface);
}
/**
* This routine installs XTLDR protocol for further usage by modules.
*
@@ -554,6 +580,7 @@ BlpInstallXtLoaderProtocol()
BlpLdrProtocol.Memory.FreePages = BlMemoryFreePages;
BlpLdrProtocol.Memory.FreePool = BlMemoryFreePool;
BlpLdrProtocol.Memory.GetMemoryMap = BlGetMemoryMap;
BlpLdrProtocol.Protocol.Close = BlCloseProtocol;
BlpLdrProtocol.Protocol.GetModulesList = BlGetModulesList;
BlpLdrProtocol.Protocol.Open = BlOpenProtocol;
BlpLdrProtocol.Protocol.Install = BlInstallProtocol;
@@ -569,5 +596,5 @@ BlpInstallXtLoaderProtocol()
/* Register XTLDR loader protocol */
BlDebugPrint(L"Registering XT loader protocol\n");
return BlInstallProtocol(&Guid, &BlpLdrProtocol);
return BlInstallProtocol(&BlpLdrProtocol, &Guid);
}

View File

@@ -22,6 +22,7 @@ BlInitializeBootLoader()
{
EFI_GUID LipGuid = EFI_LOADED_IMAGE_PROTOCOL_GUID;
PEFI_LOADED_IMAGE_PROTOCOL LoadedImage;
EFI_HANDLE Handle;
EFI_STATUS Status;
/* Set current XTLDR's EFI BootServices status */
@@ -45,7 +46,7 @@ BlInitializeBootLoader()
if(DEBUG)
{
/* Attempt to open EFI LoadedImage protocol */
Status = BlOpenProtocol((PVOID *)&LoadedImage, &LipGuid);
Status = BlOpenProtocol(&Handle, (PVOID *)&LoadedImage, &LipGuid);
if(Status == STATUS_EFI_SUCCESS)
{
/* Protocol opened successfully, print useful debug information */
@@ -172,6 +173,7 @@ BlInvokeBootProtocol(IN PLIST_ENTRY OptionsList)
EFI_GUID BootProtocolGuid;
SIZE_T ModuleListLength;
PWCHAR ModulesList;
EFI_HANDLE Handle;
EFI_STATUS Status;
/* Initialize boot parameters and a list of modules */
@@ -262,7 +264,7 @@ BlInvokeBootProtocol(IN PLIST_ENTRY OptionsList)
}
/* Open boot protocol */
Status = BlOpenProtocol((PVOID *)&BootProtocol, &BootProtocolGuid);
Status = BlOpenProtocol(&Handle, (PVOID *)&BootProtocol, &BootProtocolGuid);
if(Status != STATUS_EFI_SUCCESS)
{
/* Failed to open boot protocol */