From db0e1d40aa047afe92462080b93b2f282bdfff90 Mon Sep 17 00:00:00 2001 From: Rafal Kupiec Date: Sun, 17 Mar 2024 23:06:37 +0100 Subject: [PATCH] Allow boot protocols to supply own routine for converting EFI memory type into OS-specific memory type --- sdk/xtdk/bltypes.h | 5 ++++- xtldr/includes/xtldr.h | 3 ++- xtldr/memory.c | 15 +++++++++++++-- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/sdk/xtdk/bltypes.h b/sdk/xtdk/bltypes.h index e20e2b9..2bf7737 100644 --- a/sdk/xtdk/bltypes.h +++ b/sdk/xtdk/bltypes.h @@ -39,6 +39,9 @@ /* TUI dialog box maximum width */ #define XTBL_TUI_MAX_DIALOG_WIDTH 100 +/* XTLDR Routine pointers */ +typedef LONG (*PBL_GET_MEMTYPE_ROUTINE)(IN LONG EfiMemoryType); + /* Boot Loader protocol routine pointers */ typedef EFI_STATUS (*PBL_ALLOCATE_PAGES)(IN ULONGLONG Size, OUT PEFI_PHYSICAL_ADDRESS Memory); typedef EFI_STATUS (*PBL_ALLOCATE_POOL)(IN UINT_PTR Size, OUT PVOID *Memory); @@ -77,7 +80,7 @@ typedef EFI_STATUS (*PBL_INSTALL_XT_PROTOCOL)(IN PVOID Interface, IN PEFI_GUID G 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_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, IN PBL_GET_MEMTYPE_ROUTINE GetMemoryTypeRoutine); 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 ULONGLONG NumberOfPages, IN LOADER_MEMORY_TYPE MemoryType); typedef EFI_STATUS (*PBL_OPEN_VOLUME)(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath, OUT PEFI_HANDLE DiskHandle, OUT PEFI_FILE_HANDLE *FsHandle); diff --git a/xtldr/includes/xtldr.h b/xtldr/includes/xtldr.h index 8b10200..0304348 100644 --- a/xtldr/includes/xtldr.h +++ b/xtldr/includes/xtldr.h @@ -227,7 +227,8 @@ BlLocateProtocolHandles(OUT PEFI_HANDLE *Handles, XTCDECL EFI_STATUS BlMapEfiMemory(IN OUT PXTBL_PAGE_MAPPING PageMap, - IN OUT PVOID *DesiredVirtualAddress); + IN OUT PVOID *DesiredVirtualAddress, + IN PBL_GET_MEMTYPE_ROUTINE GetMemoryTypeRoutine); XTCDECL EFI_STATUS diff --git a/xtldr/memory.c b/xtldr/memory.c index efe5952..5daf8d1 100644 --- a/xtldr/memory.c +++ b/xtldr/memory.c @@ -264,6 +264,9 @@ BlInitializePageMap(OUT PXTBL_PAGE_MAPPING PageMap, * @param MemoryMapAddress * Supplies a virtual address, where EFI memory will be mapped. * + * @param GetMemoryTypeRoutine + * Supplies a pointer to the routine which will be used to match EFI memory type to the OS memory type. + * * @return This routine returns a status code. * * @since XT 1.0 @@ -271,7 +274,8 @@ BlInitializePageMap(OUT PXTBL_PAGE_MAPPING PageMap, XTCDECL EFI_STATUS BlMapEfiMemory(IN OUT PXTBL_PAGE_MAPPING PageMap, - IN OUT PVOID *MemoryMapAddress) + IN OUT PVOID *MemoryMapAddress, + IN PBL_GET_MEMTYPE_ROUTINE GetMemoryTypeRoutine) { PEFI_MEMORY_DESCRIPTOR Descriptor; LOADER_MEMORY_TYPE MemoryType; @@ -284,6 +288,13 @@ BlMapEfiMemory(IN OUT PXTBL_PAGE_MAPPING PageMap, /* Set virtual address as specified in argument */ VirtualAddress = *MemoryMapAddress; + /* Check if custom memory type routine is specified */ + if(GetMemoryTypeRoutine == NULL) + { + /* Use default memory type routine */ + GetMemoryTypeRoutine = (PBL_GET_MEMTYPE_ROUTINE)BlpGetLoaderMemoryType; + } + /* Allocate and zero-fill buffer for EFI memory map */ BlAllocateMemoryPool(sizeof(EFI_MEMORY_MAP), (PVOID*)&MemoryMap); RtlZeroMemory(MemoryMap, sizeof(EFI_MEMORY_MAP)); @@ -307,7 +318,7 @@ BlMapEfiMemory(IN OUT PXTBL_PAGE_MAPPING PageMap, if((Descriptor->PhysicalStart + (Descriptor->NumberOfPages * EFI_PAGE_SIZE)) <= (UINT_PTR)-1) { /* Convert EFI memory type into XTLDR memory type */ - MemoryType = BlpGetLoaderMemoryType(Descriptor->Type); + MemoryType = GetMemoryTypeRoutine(Descriptor->Type); /* Do memory mappings depending on memory type */ if(MemoryType == LoaderFirmwareTemporary)