From 0e4575b278f67c96fb89f9b2948d19b5d87468f2 Mon Sep 17 00:00:00 2001 From: Rafal Kupiec Date: Wed, 17 Jan 2024 22:24:55 +0100 Subject: [PATCH] Use new paging implementation --- xtldr/modules/xtos_o/amd64/memory.c | 198 ++------------------------- xtldr/modules/xtos_o/i686/memory.c | 123 ++--------------- xtldr/modules/xtos_o/includes/xtos.h | 9 +- xtldr/modules/xtos_o/xtos.c | 36 +++-- 4 files changed, 49 insertions(+), 317 deletions(-) diff --git a/xtldr/modules/xtos_o/amd64/memory.c b/xtldr/modules/xtos_o/amd64/memory.c index 354c9cb..9008bc4 100644 --- a/xtldr/modules/xtos_o/amd64/memory.c +++ b/xtldr/modules/xtos_o/amd64/memory.c @@ -30,10 +30,9 @@ */ XTCDECL EFI_STATUS -XtEnablePaging(IN PLIST_ENTRY MemoryMappings, +XtEnablePaging(IN PXTBL_PAGE_MAPPING PageMap, IN PVOID VirtualAddress, - IN PEFI_LOADED_IMAGE_PROTOCOL ImageProtocol, - IN PVOID *PtePointer) + IN PEFI_LOADED_IMAGE_PROTOCOL ImageProtocol) { PLOADER_MEMORY_MAPPING Mapping; EFI_PHYSICAL_ADDRESS Address; @@ -50,8 +49,8 @@ XtEnablePaging(IN PLIST_ENTRY MemoryMappings, } /* Assign and zero-fill memory used by page mappings */ - *PtePointer = (PVOID)(UINT_PTR)Address; - RtlZeroMemory(*PtePointer, EFI_PAGE_SIZE); + PageMap->PtePointer = (PVOID)(UINT_PTR)Address; + RtlZeroMemory(PageMap->PtePointer, EFI_PAGE_SIZE); /* Get list of XTLDR modules */ ModulesList = XtLdrProtocol->Protocol.GetModulesList(); @@ -62,7 +61,7 @@ XtEnablePaging(IN PLIST_ENTRY MemoryMappings, ModuleInfo = CONTAIN_RECORD(ModulesListEntry, XTBL_MODULE_INFO, Flink); /* Map module code */ - Status = XtAddVirtualMemoryMapping(MemoryMappings, ModuleInfo->ModuleBase, ModuleInfo->ModuleBase, + Status = XtLdrProtocol->Memory.MapVirtualMemory(PageMap, ModuleInfo->ModuleBase, ModuleInfo->ModuleBase, EFI_SIZE_TO_PAGES(ModuleInfo->ModuleSize), LoaderFirmwareTemporary); if(Status != STATUS_EFI_SUCCESS) @@ -76,11 +75,11 @@ XtEnablePaging(IN PLIST_ENTRY MemoryMappings, } /* Map XTLDR code */ - XtAddVirtualMemoryMapping(MemoryMappings, ImageProtocol->ImageBase, ImageProtocol->ImageBase, + XtLdrProtocol->Memory.MapVirtualMemory(PageMap, ImageProtocol->ImageBase, ImageProtocol->ImageBase, EFI_SIZE_TO_PAGES(ImageProtocol->ImageSize), LoaderFirmwareTemporary); /* Add page mapping itself to memory mapping */ - Status = XtAddVirtualMemoryMapping(MemoryMappings, NULL, *PtePointer, 1, LoaderMemoryData); + Status = XtLdrProtocol->Memory.MapVirtualMemory(PageMap, NULL, PageMap->PtePointer, 1, LoaderMemoryData); if(Status != STATUS_EFI_SUCCESS) { /* Mapping PML4 failed */ @@ -89,8 +88,8 @@ XtEnablePaging(IN PLIST_ENTRY MemoryMappings, /* Iterate through and map all the mappings*/ XtLdrProtocol->Debug.Print(L"Mapping and dumping EFI memory:\n"); - ListEntry = MemoryMappings->Flink; - while(ListEntry != MemoryMappings) + ListEntry = PageMap->MemoryMap.Flink; + while(ListEntry != &PageMap->MemoryMap) { /* Take mapping from the list */ Mapping = CONTAIN_RECORD(ListEntry, LOADER_MEMORY_MAPPING, ListEntry); @@ -103,8 +102,8 @@ XtEnablePaging(IN PLIST_ENTRY MemoryMappings, Mapping->PhysicalAddress, Mapping->VirtualAddress, Mapping->NumberOfPages); /* Map memory */ - Status = XtMapVirtualMemory(MemoryMappings, (UINT_PTR)Mapping->VirtualAddress, - (UINT_PTR)Mapping->PhysicalAddress, Mapping->NumberOfPages, PtePointer); + Status = XtLdrProtocol->Memory.MapPage(PageMap, (UINT_PTR)Mapping->VirtualAddress, + (UINT_PTR)Mapping->PhysicalAddress, Mapping->NumberOfPages); if(Status != STATUS_EFI_SUCCESS) { /* Memory mapping failed */ @@ -117,7 +116,7 @@ XtEnablePaging(IN PLIST_ENTRY MemoryMappings, } /* Map zero page as well */ - XtMapVirtualMemory(MemoryMappings, 0, 0, 1, PtePointer); + XtLdrProtocol->Memory.MapPage(PageMap, 0, 0, 1); /* Exit EFI Boot Services */ XtLdrProtocol->Debug.Print(L"Exiting EFI boot services\n"); @@ -130,178 +129,7 @@ XtEnablePaging(IN PLIST_ENTRY MemoryMappings, } /* Write PML4 to CR3 */ - ArWriteControlRegister(3, (UINT_PTR)*PtePointer); - - /* Return success */ - return STATUS_EFI_SUCCESS; -} - -/** - * This routine does the actual virtual memory mapping. - * - * @param MemoryMappings - * Supplies a pointer to linked list containing all memory mappings. - * - * @param VirtualAddress - * Supplies a virtual address of the mapping. - * - * @param PhysicalAddress - * Supplies a physical address of the mapping. - * - * @param NumberOfPages - * Supplies a number of the pages of the mapping. - * - * @param PaeExtension - * Specifies whether Physical Address Extension (PAE) is supported by the hardware. Not used on AMD64. - * - * @param PtePointer - * Supplies a pointer to an array of pointers to page table entries. - * - * @return This routine returns a status code. - * - * @since XT 1.0 - */ -XTCDECL -EFI_STATUS -XtMapVirtualMemory(IN PLIST_ENTRY MemoryMappings, - IN UINT_PTR VirtualAddress, - IN UINT_PTR PhysicalAddress, - IN UINT NumberOfPages, - IN OUT PVOID *PtePointer) -{ - PHARDWARE_PTE PageDirectoryPointTable, PageDirectory, PageTable; - UINT Pml4Index, PdpIndex, PdIndex, PtIndex; - EFI_PHYSICAL_ADDRESS Address; - UINT_PTR PageFrameNumber; - EFI_STATUS Status; - UINT64 Pointer; - - /* Set the PFN */ - PageFrameNumber = PhysicalAddress >> EFI_PAGE_SHIFT; - - /* Do the recursive mapping */ - while(NumberOfPages > 0) - { - /* Calculate indices from a virtual address */ - Pml4Index = (VirtualAddress >> 39) & 0x1FF; - PdpIndex = (VirtualAddress >> 30) & 0x1FF; - PdIndex = (VirtualAddress >> 21) & 0x1FF; - PtIndex = (VirtualAddress >> 12) & 0x1FF; - - /* Validate Page Map Level 4 (PML4) */ - if(!((PHARDWARE_PTE)(*PtePointer))[Pml4Index].Valid) - { - /* Allocate pages for the PDPT */ - Status = XtLdrProtocol->Memory.AllocatePages(1, &Address); - if (Status != STATUS_EFI_SUCCESS) { - /* Memory allocation failure */ - return Status; - } - - /* Add new memory mapping */ - Status = XtAddVirtualMemoryMapping(MemoryMappings, NULL, (PVOID)(UINT_PTR)Address, 1, LoaderMemoryData); - if(Status != STATUS_EFI_SUCCESS) { - /* Memory mapping failed */ - return Status; - } - - /* Fill allocated memory with zeros */ - RtlZeroMemory((PVOID)(UINT_PTR)Address, EFI_PAGE_SIZE); - - /* Set paging entry settings */ - ((PHARDWARE_PTE)(*PtePointer))[Pml4Index].PageFrameNumber = Address / EFI_PAGE_SIZE; - ((PHARDWARE_PTE)(*PtePointer))[Pml4Index].Valid = 1; - ((PHARDWARE_PTE)(*PtePointer))[Pml4Index].Write = 1; - PageDirectoryPointTable = (PHARDWARE_PTE)(UINT_PTR)Address; - } - else - { - /* Find Page Directory Point Table (PDPT) */ - Pointer = ((PHARDWARE_PTE)(*PtePointer))[Pml4Index].PageFrameNumber; - Pointer <<= EFI_PAGE_SHIFT; - PageDirectoryPointTable = (PHARDWARE_PTE)(UINT_PTR)Pointer; - } - - /* Validate Page Directory Point Table (PDPT)*/ - if(!PageDirectoryPointTable[PdpIndex].Valid) - { - /* Allocate pages for the PD */ - Status = XtLdrProtocol->Memory.AllocatePages(1, &Address); - if (Status != STATUS_EFI_SUCCESS) { - /* Memory allocation failure */ - return Status; - } - - /* Add new memory mapping */ - Status = XtAddVirtualMemoryMapping(MemoryMappings, NULL, (PVOID)(UINT_PTR)Address, 1, LoaderMemoryData); - if (Status != STATUS_EFI_SUCCESS) { - /* Memory mapping failed */ - return Status; - } - - /* Fill allocated memory with zeros */ - RtlZeroMemory((PVOID)(UINT_PTR)Address, EFI_PAGE_SIZE); - - /* Set paging entry settings */ - PageDirectoryPointTable[PdpIndex].PageFrameNumber = Address / EFI_PAGE_SIZE; - PageDirectoryPointTable[PdpIndex].Valid = 1; - PageDirectoryPointTable[PdpIndex].Write = 1; - PageDirectory = (PHARDWARE_PTE)(UINT_PTR)Address; - } - else - { - /* Find Page Directory (PD) */ - Pointer = PageDirectoryPointTable[PdpIndex].PageFrameNumber; - Pointer <<= EFI_PAGE_SHIFT; - PageDirectory = (PHARDWARE_PTE)(UINT_PTR)Pointer; - } - - /* Validate Page Directory (PD)*/ - if(!PageDirectory[PdIndex].Valid) - { - /* Allocate pages for the PT */ - Status = XtLdrProtocol->Memory.AllocatePages(1, &Address); - if (Status != STATUS_EFI_SUCCESS) { - /* Memory allocation failure */ - return Status; - } - - /* Add new memory mapping */ - Status = XtAddVirtualMemoryMapping(MemoryMappings, NULL, (PVOID)(UINT_PTR)Address, 1, LoaderMemoryData); - if (Status != STATUS_EFI_SUCCESS) { - /* Memory mapping failed */ - return Status; - } - - /* Fill allocated memory with zeros */ - RtlZeroMemory((PVOID)(UINT_PTR)Address, EFI_PAGE_SIZE); - - /* Set paging entry settings */ - PageDirectory[PdIndex].PageFrameNumber = Address / EFI_PAGE_SIZE; - PageDirectory[PdIndex].Valid = 1; - PageDirectory[PdIndex].Write = 1; - PageTable = (PHARDWARE_PTE)(UINT_PTR)Address; - } - else - { - /* Find Page Table (PT) */ - Pointer = PageDirectory[PdIndex].PageFrameNumber; - Pointer <<= EFI_PAGE_SHIFT; - PageTable = (PHARDWARE_PTE)(UINT_PTR)Pointer; - } - - /* Set paging entry settings */ - PageTable[PtIndex].PageFrameNumber = PageFrameNumber; - PageTable[PtIndex].Valid = 1; - PageTable[PtIndex].Write = 1; - - /* Take next virtual address and PFN */ - VirtualAddress += EFI_PAGE_SIZE; - PageFrameNumber++; - - /* Decrease number of pages left */ - NumberOfPages--; - } + ArWriteControlRegister(3, (UINT_PTR)PageMap->PtePointer); /* Return success */ return STATUS_EFI_SUCCESS; diff --git a/xtldr/modules/xtos_o/i686/memory.c b/xtldr/modules/xtos_o/i686/memory.c index d39a0de..2f99eb0 100644 --- a/xtldr/modules/xtos_o/i686/memory.c +++ b/xtldr/modules/xtos_o/i686/memory.c @@ -30,10 +30,9 @@ */ XTCDECL EFI_STATUS -XtEnablePaging(IN PLIST_ENTRY MemoryMappings, +XtEnablePaging(IN PXTBL_PAGE_MAPPING PageMap, IN PVOID VirtualAddress, - IN PEFI_LOADED_IMAGE_PROTOCOL ImageProtocol, - IN PVOID *PtePointer) + IN PEFI_LOADED_IMAGE_PROTOCOL ImageProtocol) { UINT_PTR PhysicalAddress, DescriptorCount; EFI_PHYSICAL_ADDRESS Address, PDPTAddress = 0; @@ -137,16 +136,16 @@ XtEnablePaging(IN PLIST_ENTRY MemoryMappings, } /* Set and zero memory used by page mappings and CR3 */ - *PtePointer = (PVOID)(UINT_PTR)PDPTAddress; - RtlZeroMemory(*PtePointer, EFI_PAGE_SIZE); + PageMap->PtePointer = (PVOID)(UINT_PTR)PDPTAddress; + RtlZeroMemory(PageMap->PtePointer, EFI_PAGE_SIZE); RtlZeroMemory((PVOID)Address, EFI_PAGE_SIZE * 4); /* Set the page directory into the PDPT and mark it present */ for(Index = 0; Index < 4; Index++) { /* Set paging entry settings */ - ((PHARDWARE_PTE)*PtePointer)[Index].PageFrameNumber = Address / EFI_PAGE_SIZE; - ((PHARDWARE_PTE)*PtePointer)[Index].Valid = 1; + ((PHARDWARE_PTE)PageMap->PtePointer)[Index].PageFrameNumber = Address / EFI_PAGE_SIZE; + ((PHARDWARE_PTE)PageMap->PtePointer)[Index].Valid = 1; /* Next valid PFN address */ Address += EFI_PAGE_SIZE; @@ -161,7 +160,7 @@ XtEnablePaging(IN PLIST_ENTRY MemoryMappings, ModuleInfo = CONTAIN_RECORD(ModulesListEntry, XTBL_MODULE_INFO, Flink); /* Map module code */ - XtAddVirtualMemoryMapping(MemoryMappings, ModuleInfo->ModuleBase, ModuleInfo->ModuleBase, + XtLdrProtocol->Memory.MapVirtualMemory(PageMap, ModuleInfo->ModuleBase, ModuleInfo->ModuleBase, EFI_SIZE_TO_PAGES(ModuleInfo->ModuleSize), LoaderFirmwareTemporary); if(Status != STATUS_EFI_SUCCESS) @@ -175,11 +174,11 @@ XtEnablePaging(IN PLIST_ENTRY MemoryMappings, } /* Map XTLDR code */ - XtAddVirtualMemoryMapping(MemoryMappings, ImageProtocol->ImageBase, ImageProtocol->ImageBase, + XtLdrProtocol->Memory.MapVirtualMemory(PageMap, ImageProtocol->ImageBase, ImageProtocol->ImageBase, EFI_SIZE_TO_PAGES(ImageProtocol->ImageSize), LoaderFirmwareTemporary); /* Add page mapping itself to memory mapping */ - Status = XtAddVirtualMemoryMapping(MemoryMappings, NULL, *PtePointer, 1, LoaderMemoryData); + Status = XtLdrProtocol->Memory.MapVirtualMemory(PageMap, NULL, PageMap->PtePointer, 1, LoaderMemoryData); if(Status != STATUS_EFI_SUCCESS) { /* Mapping PD failed */ @@ -188,8 +187,8 @@ XtEnablePaging(IN PLIST_ENTRY MemoryMappings, /* Iterate through and map all the mappings */ XtLdrProtocol->Debug.Print(L"Mapping and dumping EFI memory:\n"); - ListEntry = MemoryMappings->Flink; - while(ListEntry != MemoryMappings) + ListEntry = PageMap->MemoryMap.Flink; + while(ListEntry != &PageMap->MemoryMap) { /* Take mapping from the list */ Mapping = CONTAIN_RECORD(ListEntry, LOADER_MEMORY_MAPPING, ListEntry); @@ -202,8 +201,8 @@ XtEnablePaging(IN PLIST_ENTRY MemoryMappings, Mapping->PhysicalAddress, Mapping->VirtualAddress, Mapping->NumberOfPages); /* Map memory */ - Status = XtMapVirtualMemory(MemoryMappings, (UINT_PTR)Mapping->VirtualAddress, - (UINT_PTR)Mapping->PhysicalAddress, Mapping->NumberOfPages, PtePointer); + Status = XtLdrProtocol->Memory.MapPage(PageMap, (UINT_PTR)Mapping->VirtualAddress, + (UINT_PTR)Mapping->PhysicalAddress, Mapping->NumberOfPages); if(Status != STATUS_EFI_SUCCESS) { /* Memory mapping failed */ @@ -216,7 +215,7 @@ XtEnablePaging(IN PLIST_ENTRY MemoryMappings, } /* Map zero page as well */ - XtMapVirtualMemory(MemoryMappings, 0, 0, 1, PtePointer); + XtLdrProtocol->Memory.MapPage(PageMap, 0, 0, 1); /* Exit EFI Boot Services */ XtLdrProtocol->Debug.Print(L"Exiting EFI boot services\n"); @@ -232,7 +231,7 @@ XtEnablePaging(IN PLIST_ENTRY MemoryMappings, ArWriteControlRegister(4, ArReadControlRegister(4) | CR4_PAE); /* Write page mappings to CR3 */ - ArWriteControlRegister(3, (UINT_PTR)*PtePointer); + ArWriteControlRegister(3, (UINT_PTR)PageMap->PtePointer); /* Enable paging */ ArWriteControlRegister(0, ArReadControlRegister(0) | CR0_PG); @@ -240,95 +239,3 @@ XtEnablePaging(IN PLIST_ENTRY MemoryMappings, /* Return success */ return STATUS_EFI_SUCCESS; } - -/** - * This routine does the actual virtual memory mapping. - * - * @param MemoryMappings - * Supplies a pointer to linked list containing all memory mappings. - * - * @param VirtualAddress - * Supplies a virtual address of the mapping. - * - * @param PhysicalAddress - * Supplies a physical address of the mapping. - * - * @param NumberOfPages - * Supplies a number of the pages of the mapping. - * - * @param PaeExtension - * Specifies whether Physical Address Extension (PAE) is supported by the hardware. - * - * @param PtePointer - * Supplies a pointer to an array of pointers to page table entries. - * - * @return This routine returns a status code. - * - * @since XT 1.0 - */ -XTCDECL -EFI_STATUS -XtMapVirtualMemory(IN PLIST_ENTRY MemoryMappings, - IN UINT_PTR VirtualAddress, - IN UINT_PTR PhysicalAddress, - IN UINT NumberOfPages, - IN OUT PVOID *PtePointer) -{ - EFI_PHYSICAL_ADDRESS Address; - UINT_PTR PageFrameNumber; - PHARDWARE_PTE PageTable, PageDirectory; - EFI_STATUS Status; - unsigned int PdIndex, PtIndex; - - /* Set the PFN */ - PageFrameNumber = PhysicalAddress >> EFI_PAGE_SHIFT; - - /* Do the recursive mapping */ - while(NumberOfPages > 0) - { - /* Find Page Directory and calculate indices from a virtual address */ - PageDirectory = (PHARDWARE_PTE)(UINT_PTR)(((PHARDWARE_PTE)(*PtePointer))[VirtualAddress >> 30].PageFrameNumber * EFI_PAGE_SIZE); - PdIndex = (VirtualAddress >> 21) & 0x1FF; - PtIndex = (VirtualAddress & 0x1FF000) >> 12; - - /* Validate Page Directory */ - if(!PageDirectory[PdIndex].Valid) { - /* Allocate pages for new page table */ - Status = XtLdrProtocol->Memory.AllocatePages(1, &Address); - if(Status != STATUS_EFI_SUCCESS) { - /* Memory allocation failure */ - return Status; - } - - /* Fill allocated memory with zeros */ - RtlZeroMemory((PVOID)(UINT_PTR)Address, EFI_PAGE_SIZE); - - /* Set paging entry settings */ - PageDirectory[PdIndex].PageFrameNumber = Address / EFI_PAGE_SIZE; - PageDirectory[PdIndex].Valid = 1; - PageDirectory[PdIndex].Write = 1; - - /* Set page table */ - PageTable = (PHARDWARE_PTE)(UINT_PTR)Address; - } - else - { - /* Set page table */ - PageTable = (PHARDWARE_PTE)(UINT_PTR)(PageDirectory[PdIndex].PageFrameNumber * EFI_PAGE_SIZE); - } - /* Set page table settings */ - PageTable[PtIndex].PageFrameNumber = PageFrameNumber; - PageTable[PtIndex].Valid = 1; - PageTable[PtIndex].Write = 1; - - /* Take next virtual address and PFN */ - VirtualAddress += EFI_PAGE_SIZE; - PageFrameNumber++; - - /* Decrease number of pages left */ - NumberOfPages--; - } - - /* Return success */ - return STATUS_EFI_SUCCESS; -} diff --git a/xtldr/modules/xtos_o/includes/xtos.h b/xtldr/modules/xtos_o/includes/xtos.h index 34695c5..caeae63 100644 --- a/xtldr/modules/xtos_o/includes/xtos.h +++ b/xtldr/modules/xtos_o/includes/xtos.h @@ -51,10 +51,9 @@ XtConvertEfiMemoryType(IN EFI_MEMORY_TYPE EfiMemoryType); XTCDECL EFI_STATUS -XtEnablePaging(IN PLIST_ENTRY MemoryMappings, +XtEnablePaging(IN PXTBL_PAGE_MAPPING PageMap, IN PVOID VirtualAddress, - IN PEFI_LOADED_IMAGE_PROTOCOL ImageProtocol, - IN PVOID *PtePointer); + IN PEFI_LOADED_IMAGE_PROTOCOL ImageProtocol); XTCDECL EFI_STATUS @@ -83,11 +82,11 @@ XtpBootSequence(IN PEFI_FILE_HANDLE BootDir, XTCDECL EFI_STATUS -XtpInitializeApicBase(IN PLIST_ENTRY MemoryMappings); +XtpInitializeApicBase(IN PXTBL_PAGE_MAPPING PageMap); XTCDECL EFI_STATUS -XtpInitializeLoaderBlock(IN PLIST_ENTRY MemoryMappings, +XtpInitializeLoaderBlock(IN PXTBL_PAGE_MAPPING PageMap, IN PVOID *VirtualAddress, IN PXTBL_BOOT_PARAMETERS Parameters); diff --git a/xtldr/modules/xtos_o/xtos.c b/xtldr/modules/xtos_o/xtos.c index 1e06dc7..cf7da62 100644 --- a/xtldr/modules/xtos_o/xtos.c +++ b/xtldr/modules/xtos_o/xtos.c @@ -22,9 +22,6 @@ PXTBL_EXECUTABLE_IMAGE_PROTOCOL XtPeCoffProtocol; /* XTOS Boot Protocol */ XTBL_BOOT_PROTOCOL XtBootProtocol; -/* XTOS Page Map */ -PVOID XtPageMap; - /** * Starts the operating system according to the provided parameters using XTOS boot protocol. * @@ -182,27 +179,28 @@ XtpBootSequence(IN PEFI_FILE_HANDLE BootDir, PEFI_LOADED_IMAGE_PROTOCOL ImageProtocol; PVOID VirtualAddress, VirtualMemoryArea; PXT_ENTRY_POINT KernelEntryPoint; - LIST_ENTRY MemoryMappings; EFI_HANDLE ProtocolHandle; EFI_STATUS Status; + XTBL_PAGE_MAPPING PageMap; /* Initialize XTOS startup sequence */ XtLdrProtocol->Debug.Print(L"Initializing XTOS startup sequence\n"); +XtLdrProtocol->Debug.Print(L"DUPA1\n"); /* Set base virtual memory area for the kernel mappings */ VirtualMemoryArea = (PVOID)KSEG0_BASE; VirtualAddress = (PVOID)(KSEG0_BASE + KSEG0_KERNEL_BASE); - /* Initialize memory mapping linked list */ - RtlInitializeListHead(&MemoryMappings); - /* Initialize virtual memory mappings */ - Status = XtInitializeVirtualMemory(&MemoryMappings, &VirtualMemoryArea); + XtLdrProtocol->Memory.InitializePageMap(&PageMap, 3, VirtualMemoryArea); +XtLdrProtocol->Debug.Print(L"DUPA2\n"); + + Status = XtLdrProtocol->Memory.MapEfiMemory(&PageMap, NULL); if(Status != STATUS_EFI_SUCCESS) { - /* Failed to initialize virtual memory */ return Status; } +XtLdrProtocol->Debug.Print(L"DUPA3\n"); /* Load the kernel */ Status = XtpLoadModule(BootDir, Parameters->KernelFile, VirtualAddress, LoaderSystemCode, &ImageContext); @@ -213,7 +211,7 @@ XtpBootSequence(IN PEFI_FILE_HANDLE BootDir, } /* Add kernel image memory mapping */ - Status = XtAddVirtualMemoryMapping(&MemoryMappings, ImageContext->VirtualAddress, + Status = XtLdrProtocol->Memory.MapVirtualMemory(&PageMap, ImageContext->VirtualAddress, ImageContext->PhysicalAddress, ImageContext->ImagePages, 0); if(Status != STATUS_EFI_SUCCESS) { @@ -227,7 +225,7 @@ XtpBootSequence(IN PEFI_FILE_HANDLE BootDir, KernelParameters = (PKERNEL_INITIALIZATION_BLOCK)VirtualAddress; /* Setup and map kernel initialization block */ - Status = XtpInitializeLoaderBlock(&MemoryMappings, &VirtualAddress, Parameters); + Status = XtpInitializeLoaderBlock(&PageMap, &VirtualAddress, Parameters); if(Status != STATUS_EFI_SUCCESS) { /* Failed to setup kernel initialization block */ @@ -236,7 +234,7 @@ XtpBootSequence(IN PEFI_FILE_HANDLE BootDir, } /* Find and map APIC base address */ - Status = XtpInitializeApicBase(&MemoryMappings); + Status = XtpInitializeApicBase(&PageMap); if(Status != STATUS_EFI_SUCCESS) { /* Failed to setup kernel initialization block */ @@ -252,7 +250,7 @@ XtpBootSequence(IN PEFI_FILE_HANDLE BootDir, /* Enable paging */ XtLdrProtocol->Protocol.Open(&ProtocolHandle, (PVOID*)&ImageProtocol, &LoadedImageGuid); - Status = XtEnablePaging(&MemoryMappings, VirtualAddress, ImageProtocol, &XtPageMap); + Status = XtEnablePaging(&PageMap, VirtualAddress, ImageProtocol); if(Status != STATUS_EFI_SUCCESS) { /* Failed to enable paging */ @@ -280,7 +278,7 @@ XtpBootSequence(IN PEFI_FILE_HANDLE BootDir, */ XTCDECL EFI_STATUS -XtpInitializeApicBase(IN PLIST_ENTRY MemoryMappings) +XtpInitializeApicBase(IN PXTBL_PAGE_MAPPING PageMap) { PCPUID_REGISTERS CpuRegisters = NULL; PVOID ApicBaseAddress; @@ -305,7 +303,7 @@ XtpInitializeApicBase(IN PLIST_ENTRY MemoryMappings) ApicBaseAddress = (PVOID)((UINT_PTR)ArReadModelSpecificRegister(0x1B) & 0xFFFFF000); /* Map APIC base address */ - XtAddVirtualMemoryMapping(MemoryMappings, (PVOID)APIC_BASE, ApicBaseAddress, 1, LoaderFirmwarePermanent); + XtLdrProtocol->Memory.MapVirtualMemory(PageMap, (PVOID)APIC_BASE, ApicBaseAddress, 1, LoaderFirmwarePermanent); return STATUS_EFI_SUCCESS; } @@ -324,7 +322,7 @@ XtpInitializeApicBase(IN PLIST_ENTRY MemoryMappings) */ XTCDECL EFI_STATUS -XtpInitializeLoaderBlock(IN PLIST_ENTRY MemoryMappings, +XtpInitializeLoaderBlock(IN PXTBL_PAGE_MAPPING PageMap, IN PVOID *VirtualAddress, IN PXTBL_BOOT_PARAMETERS Parameters) { @@ -369,7 +367,7 @@ XtpInitializeLoaderBlock(IN PLIST_ENTRY MemoryMappings, /* Store information about FrameBuffer device */ FrameBufProtocol->GetDisplayInformation(&LoaderBlock->LoaderInformation.FrameBuffer); - FrameBufProtocol->PrintDisplayInformation(); + // FrameBufProtocol->PrintDisplayInformation(); } else { @@ -400,7 +398,7 @@ XtpInitializeLoaderBlock(IN PLIST_ENTRY MemoryMappings, RtlCopyMemory(&LoaderBlock->KernelParameters, Parameters->Parameters, RtlWideStringLength(Parameters->Parameters, 0)); /* Map kernel initialization block */ - XtAddVirtualMemoryMapping(MemoryMappings, *VirtualAddress, (PVOID)LoaderBlock, + XtLdrProtocol->Memory.MapVirtualMemory(PageMap, *VirtualAddress, (PVOID)LoaderBlock, BlockPages, LoaderSystemBlock); /* Calculate next valid virtual address */ @@ -413,7 +411,7 @@ XtpInitializeLoaderBlock(IN PLIST_ENTRY MemoryMappings, FrameBufferPages = EFI_SIZE_TO_PAGES(LoaderBlock->LoaderInformation.FrameBuffer.BufferSize); /* Map frame buffer memory */ - XtAddVirtualMemoryMapping(MemoryMappings, *VirtualAddress, + XtLdrProtocol->Memory.MapVirtualMemory(PageMap, *VirtualAddress, LoaderBlock->LoaderInformation.FrameBuffer.Address, FrameBufferPages, LoaderFirmwarePermanent);