Use new paging implementation
This commit is contained in:
parent
89c18bbce6
commit
0e4575b278
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user