From 8e61e95cc2d3409937a1226a39900eb5cf24597f Mon Sep 17 00:00:00 2001 From: Rafal Kupiec Date: Sun, 28 Jan 2024 23:16:01 +0100 Subject: [PATCH] Implement BlPhysicalAddressToVirtual() routine --- sdk/xtdk/bltypes.h | 2 ++ xtldr/includes/xtldr.h | 6 ++++++ xtldr/memory.c | 26 ++++++++++++++++++++++++++ xtldr/protocol.c | 1 + 4 files changed, 35 insertions(+) diff --git a/sdk/xtdk/bltypes.h b/sdk/xtdk/bltypes.h index 7611706..d39b39d 100644 --- a/sdk/xtdk/bltypes.h +++ b/sdk/xtdk/bltypes.h @@ -91,6 +91,7 @@ typedef EFI_STATUS (*PBL_MAP_VIRTUAL_MEMORY)(IN OUT PXTBL_PAGE_MAPPING PageMap, 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 PVOID (*PBL_PHYSICAL_ADDRESS_TO_VIRTUAL)(IN PVOID PhysicalAddress, IN PVOID PhysicalBase, IN PVOID VirtualBase); 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); @@ -315,6 +316,7 @@ typedef struct _XTBL_LOADER_PROTOCOL PBL_MAP_EFI_MEMORY MapEfiMemory; PBL_MAP_PAGE MapPage; PBL_MAP_VIRTUAL_MEMORY MapVirtualMemory; + PBL_PHYSICAL_ADDRESS_TO_VIRTUAL PhysicalAddressToVirtual; PBL_SET_MEMORY SetMemory; PBL_ZERO_MEMORY ZeroMemory; } Memory; diff --git a/xtldr/includes/xtldr.h b/xtldr/includes/xtldr.h index 93c4b98..032e4cb 100644 --- a/xtldr/includes/xtldr.h +++ b/xtldr/includes/xtldr.h @@ -247,6 +247,12 @@ BlOpenProtocolHandle(IN EFI_HANDLE Handle, OUT PVOID *ProtocolHandler, IN PEFI_GUID ProtocolGuid); +XTCDECL +PVOID +BlPhysicalAddressToVirtual(IN PVOID PhysicalAddress, + IN PVOID PhysicalBase, + IN PVOID VirtualBase); + XTCDECL VOID BlQueryConsoleMode(OUT PUINT_PTR ResX, diff --git a/xtldr/memory.c b/xtldr/memory.c index ccf0a5c..965dd73 100644 --- a/xtldr/memory.c +++ b/xtldr/memory.c @@ -488,6 +488,32 @@ BlMapVirtualMemory(IN OUT PXTBL_PAGE_MAPPING PageMap, return STATUS_EFI_SUCCESS; } +/** + * Converts physical address to virtual address based on physical base and virtual base. + * + * @param PhysicalAddress + * Specifies physical address that will be converted to virtual address. + * + * @param PhysicalBase + * Supplies a physical base address. + * + * @param VirtualBase + * Supplies a virtual base address. + * + * @return This routine returns a mapped virtual address. + * + * @since XT 1.0 + */ +XTCDECL +PVOID +BlPhysicalAddressToVirtual(IN PVOID PhysicalAddress, + IN PVOID PhysicalBase, + IN PVOID VirtualBase) +{ + /* Convert physical address to virtual address */ + return (PUCHAR)VirtualBase + ((PUCHAR)PhysicalAddress - (PUCHAR)PhysicalBase); +} + /** * Converts EFI memory type to XTLDR memory type. * diff --git a/xtldr/protocol.c b/xtldr/protocol.c index 425675d..5f8fe15 100644 --- a/xtldr/protocol.c +++ b/xtldr/protocol.c @@ -636,6 +636,7 @@ BlpInstallXtLoaderProtocol() BlpLdrProtocol.Memory.MapEfiMemory = BlMapEfiMemory; BlpLdrProtocol.Memory.MapPage = BlMapPage; BlpLdrProtocol.Memory.MapVirtualMemory = BlMapVirtualMemory; + BlpLdrProtocol.Memory.PhysicalAddressToVirtual = BlPhysicalAddressToVirtual; BlpLdrProtocol.Memory.SetMemory = RtlSetMemory; BlpLdrProtocol.Memory.ZeroMemory = RtlZeroMemory; BlpLdrProtocol.Protocol.Close = BlCloseProtocol;