Revert 'Simplify and correct hardware pool mapping'
All checks were successful
Builds / ExectOS (i686, debug) (push) Successful in 44s
Builds / ExectOS (amd64, release) (push) Successful in 45s
Builds / ExectOS (i686, release) (push) Successful in 32s
Builds / ExectOS (amd64, debug) (push) Successful in 9m27s

This commit is contained in:
Aiken Harris 2025-08-09 17:15:35 +02:00 committed by CodingWorkshop Signing Team
parent 58c2092049
commit 2472cbbff4
Signed by: CodingWorkshop Signing Team
GPG Key ID: 6DC88369C82795D2

View File

@ -4,14 +4,13 @@
* FILE: xtldr/i686/memory.c * FILE: xtldr/i686/memory.c
* DESCRIPTION: EFI memory management for i686 target * DESCRIPTION: EFI memory management for i686 target
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org> * DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
* Aiken Harris <harraiken91@gmail.com>
*/ */
#include <xtos.h> #include <xtos.h>
/** /**
* Allocates and maps the 4MB hardware layer memory pool. * Maps the page table for hardware layer addess space.
* *
* @param PageMap * @param PageMap
* Supplies a pointer to the page mapping structure. * Supplies a pointer to the page mapping structure.
@ -25,23 +24,41 @@ EFI_STATUS
XtpMapHardwareMemoryPool(IN PXTBL_PAGE_MAPPING PageMap) XtpMapHardwareMemoryPool(IN PXTBL_PAGE_MAPPING PageMap)
{ {
EFI_PHYSICAL_ADDRESS Address; EFI_PHYSICAL_ADDRESS Address;
PHARDWARE_LEGACY_PTE LegacyPdeBase;
PHARDWARE_PTE PdeBase;
EFI_STATUS Status; EFI_STATUS Status;
/* Allocate a contiguous 4MB block of physical memory */ /* Allocate memory */
Status = XtLdrProtocol->Memory.AllocatePages(MM_HARDWARE_POOL_PAGE_COUNT, &Address); Status = XtLdrProtocol->Memory.AllocatePages(1, &Address);
if(Status != STATUS_EFI_SUCCESS) if(Status != STATUS_EFI_SUCCESS)
{ {
/* Memory allocation failed, return error */ /* Memory allocation failure, return error */
return Status; return Status;
} }
/* Map all the memory for the hardware layer */ /* Zero fill allocated memory */
Status = XtLdrProtocol->Memory.MapPage(PageMap, MM_HARDWARE_VA_START, Address, MM_HARDWARE_POOL_PAGE_COUNT); RtlZeroMemory((PVOID)Address, EFI_PAGE_SIZE);
if(Status != STATUS_EFI_SUCCESS)
/* Check if PAE is enabled (3-level paging) */
if(PageMap->PageMapLevel == 3)
{ {
/* Memory mapping failed, free memory and return error */ /* Get PDE base address (PAE enabled) */
XtLdrProtocol->Memory.FreePages(MM_HARDWARE_POOL_PAGE_COUNT, Address); PdeBase = (PHARDWARE_PTE)(((PHARDWARE_PTE)PageMap->PtePointer)[MM_HARDWARE_VA_START >> MM_PPI_SHIFT].PageFrameNumber << MM_PAGE_SHIFT);
return Status;
/* 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 */ /* Return success */
@ -94,7 +111,7 @@ XtEnablePaging(IN PXTBL_PAGE_MAPPING PageMap)
if(Status != STATUS_EFI_SUCCESS) if(Status != STATUS_EFI_SUCCESS)
{ {
/* Failed to map memory for hardware layer */ /* 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; return Status;
} }