From 2472cbbff46dfdcdd0a96d0c89613c396123113d Mon Sep 17 00:00:00 2001 From: Aiken Harris Date: Sat, 9 Aug 2025 17:15:35 +0200 Subject: [PATCH] Revert 'Simplify and correct hardware pool mapping' --- xtldr/modules/xtos_o/i686/memory.c | 41 +++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/xtldr/modules/xtos_o/i686/memory.c b/xtldr/modules/xtos_o/i686/memory.c index d2a4dbc..5dc83ca 100644 --- a/xtldr/modules/xtos_o/i686/memory.c +++ b/xtldr/modules/xtos_o/i686/memory.c @@ -4,14 +4,13 @@ * FILE: xtldr/i686/memory.c * DESCRIPTION: EFI memory management for i686 target * DEVELOPERS: Rafal Kupiec - * Aiken Harris */ #include /** - * Allocates and maps the 4MB hardware layer memory pool. + * Maps the page table for hardware layer addess space. * * @param PageMap * Supplies a pointer to the page mapping structure. @@ -25,23 +24,41 @@ EFI_STATUS XtpMapHardwareMemoryPool(IN PXTBL_PAGE_MAPPING PageMap) { EFI_PHYSICAL_ADDRESS Address; + PHARDWARE_LEGACY_PTE LegacyPdeBase; + PHARDWARE_PTE PdeBase; EFI_STATUS Status; - /* Allocate a contiguous 4MB block of physical memory */ - Status = XtLdrProtocol->Memory.AllocatePages(MM_HARDWARE_POOL_PAGE_COUNT, &Address); + /* Allocate memory */ + Status = XtLdrProtocol->Memory.AllocatePages(1, &Address); if(Status != STATUS_EFI_SUCCESS) { - /* Memory allocation failed, return error */ + /* Memory allocation failure, return error */ return Status; } - /* Map all the memory for the hardware layer */ - Status = XtLdrProtocol->Memory.MapPage(PageMap, MM_HARDWARE_VA_START, Address, MM_HARDWARE_POOL_PAGE_COUNT); - if(Status != STATUS_EFI_SUCCESS) + /* Zero fill allocated memory */ + RtlZeroMemory((PVOID)Address, EFI_PAGE_SIZE); + + /* Check if PAE is enabled (3-level paging) */ + if(PageMap->PageMapLevel == 3) { - /* Memory mapping failed, free memory and return error */ - XtLdrProtocol->Memory.FreePages(MM_HARDWARE_POOL_PAGE_COUNT, Address); - return Status; + /* Get PDE base address (PAE enabled) */ + PdeBase = (PHARDWARE_PTE)(((PHARDWARE_PTE)PageMap->PtePointer)[MM_HARDWARE_VA_START >> MM_PPI_SHIFT].PageFrameNumber << MM_PAGE_SHIFT); + + /* Make PDE valid */ + RtlZeroMemory(&PdeBase[(MM_HARDWARE_VA_START >> MM_PDI_SHIFT) & 0x1FF], sizeof(HARDWARE_PTE)); + PdeBase[(MM_HARDWARE_VA_START >> MM_PDI_SHIFT) & 0x1FF].PageFrameNumber = Address >> MM_PAGE_SHIFT; + PdeBase[(MM_HARDWARE_VA_START >> MM_PDI_SHIFT) & 0x1FF].Valid = 1; + PdeBase[(MM_HARDWARE_VA_START >> MM_PDI_SHIFT) & 0x1FF].Writable = 1; + } + else + { + /* Make PDE valid (PAE disabled) */ + LegacyPdeBase = (PHARDWARE_LEGACY_PTE)PageMap->PtePointer; + RtlZeroMemory(&LegacyPdeBase[MM_HARDWARE_VA_START >> MM_PDI_LEGACY_SHIFT], sizeof(HARDWARE_LEGACY_PTE)); + LegacyPdeBase[MM_HARDWARE_VA_START >> MM_PDI_LEGACY_SHIFT].Valid = 1; + LegacyPdeBase[MM_HARDWARE_VA_START >> MM_PDI_LEGACY_SHIFT].PageFrameNumber = Address >> MM_PAGE_SHIFT; + LegacyPdeBase[MM_HARDWARE_VA_START >> MM_PDI_LEGACY_SHIFT].Writable = 1; } /* Return success */ @@ -94,7 +111,7 @@ XtEnablePaging(IN PXTBL_PAGE_MAPPING PageMap) if(Status != STATUS_EFI_SUCCESS) { /* Failed to map memory for hardware layer */ - XtLdrProtocol->Debug.Print(L"Failed to map memory for hardware layer (Status code: %zX)\n", Status); + XtLdrProtocol->Debug.Print(L"Failed to map memory for hardware leyer (Status code: %zX)\n", Status); return Status; }