Compare commits
4 Commits
xtldr_pml_
...
memmgr
| Author | SHA1 | Date | |
|---|---|---|---|
|
d263f17831
|
|||
|
6175413db2
|
|||
|
428928c7e1
|
|||
|
7d2b41a044
|
@@ -28,12 +28,13 @@ EFI_STATUS
|
|||||||
Memory::BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
Memory::BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
||||||
IN ULONG_PTR SelfMapAddress)
|
IN ULONG_PTR SelfMapAddress)
|
||||||
{
|
{
|
||||||
PLIST_ENTRY ModulesList, ModulesListEntry;
|
PLIST_ENTRY ListEntry, ModulesList, ModulesListEntry;
|
||||||
|
PXTBL_MEMORY_MAPPING Mapping;
|
||||||
PXTBL_MODULE_INFO ModuleInfo;
|
PXTBL_MODULE_INFO ModuleInfo;
|
||||||
EFI_PHYSICAL_ADDRESS Address;
|
EFI_PHYSICAL_ADDRESS Address;
|
||||||
|
PVOID LoaderBase;
|
||||||
ULONGLONG LoaderSize;
|
ULONGLONG LoaderSize;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
PVOID LoaderBase;
|
|
||||||
|
|
||||||
/* Allocate pages for the Page Map */
|
/* Allocate pages for the Page Map */
|
||||||
Status = AllocatePages(AllocateAnyPages, 1, &Address);
|
Status = AllocatePages(AllocateAnyPages, 1, &Address);
|
||||||
@@ -116,28 +117,6 @@ Memory::BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
|||||||
return STATUS_EFI_PROTOCOL_ERROR;
|
return STATUS_EFI_PROTOCOL_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return success */
|
|
||||||
return STATUS_EFI_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Iterates through the memory map and physically maps all virtual addresses to page tables.
|
|
||||||
*
|
|
||||||
* @param PageMap
|
|
||||||
* Supplies a pointer to the page mapping structure.
|
|
||||||
*
|
|
||||||
* @return This routine returns a status code.
|
|
||||||
*
|
|
||||||
* @since XT 1.0
|
|
||||||
*/
|
|
||||||
XTCDECL
|
|
||||||
EFI_STATUS
|
|
||||||
Memory::CommitPageMap(IN PXTBL_PAGE_MAPPING PageMap)
|
|
||||||
{
|
|
||||||
PXTBL_MEMORY_MAPPING Mapping;
|
|
||||||
PLIST_ENTRY ListEntry;
|
|
||||||
EFI_STATUS Status;
|
|
||||||
|
|
||||||
/* Iterate through and map all the mappings*/
|
/* Iterate through and map all the mappings*/
|
||||||
Debug::Print(L"Mapping and dumping EFI memory:\n");
|
Debug::Print(L"Mapping and dumping EFI memory:\n");
|
||||||
ListEntry = PageMap->MemoryMap.Flink;
|
ListEntry = PageMap->MemoryMap.Flink;
|
||||||
|
|||||||
@@ -25,12 +25,13 @@ EFI_STATUS
|
|||||||
Memory::BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
Memory::BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
||||||
IN ULONG_PTR SelfMapAddress)
|
IN ULONG_PTR SelfMapAddress)
|
||||||
{
|
{
|
||||||
|
PLIST_ENTRY ListEntry, ModulesList, ModulesListEntry;
|
||||||
EFI_PHYSICAL_ADDRESS Address, DirectoryAddress;
|
EFI_PHYSICAL_ADDRESS Address, DirectoryAddress;
|
||||||
PLIST_ENTRY ModulesList, ModulesListEntry;
|
|
||||||
PXTBL_MODULE_INFO ModuleInfo;
|
PXTBL_MODULE_INFO ModuleInfo;
|
||||||
|
PXTBL_MEMORY_MAPPING Mapping;
|
||||||
|
PVOID LoaderBase;
|
||||||
ULONGLONG LoaderSize;
|
ULONGLONG LoaderSize;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
PVOID LoaderBase;
|
|
||||||
ULONG Index;
|
ULONG Index;
|
||||||
|
|
||||||
/* Check the page map level to determine which paging structure to create */
|
/* Check the page map level to determine which paging structure to create */
|
||||||
@@ -44,14 +45,6 @@ Memory::BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add new memory mapping for the page map itself */
|
|
||||||
Status = MapVirtualMemory(PageMap, (ULONGLONG)NULLPTR, Address, 1, LoaderMemoryData);
|
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
|
||||||
{
|
|
||||||
/* Memory mapping failure */
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Assign the allocated page to the page map and zero it out */
|
/* Assign the allocated page to the page map and zero it out */
|
||||||
PageMap->PtePointer = (PVOID)(UINT_PTR)Address;
|
PageMap->PtePointer = (PVOID)(UINT_PTR)Address;
|
||||||
RTL::Memory::ZeroMemory(PageMap->PtePointer, EFI_PAGE_SIZE);
|
RTL::Memory::ZeroMemory(PageMap->PtePointer, EFI_PAGE_SIZE);
|
||||||
@@ -64,14 +57,6 @@ Memory::BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add new memory mapping for the Page Directories (PDs) */
|
|
||||||
Status = MapVirtualMemory(PageMap, (ULONGLONG)NULLPTR, DirectoryAddress, 4, LoaderMemoryData);
|
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
|
||||||
{
|
|
||||||
/* Memory mapping failure */
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Zero-fill the allocated memory for the Page Directories */
|
/* Zero-fill the allocated memory for the Page Directories */
|
||||||
RTL::Memory::ZeroMemory((PVOID)DirectoryAddress, EFI_PAGE_SIZE * 4);
|
RTL::Memory::ZeroMemory((PVOID)DirectoryAddress, EFI_PAGE_SIZE * 4);
|
||||||
|
|
||||||
@@ -94,14 +79,6 @@ Memory::BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add new memory mapping for the page map itself */
|
|
||||||
Status = MapVirtualMemory(PageMap, (ULONGLONG)NULLPTR, Address, 1, LoaderMemoryData);
|
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
|
||||||
{
|
|
||||||
/* Memory mapping failure */
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Assign the allocated page to the page map and zero it out */
|
/* Assign the allocated page to the page map and zero it out */
|
||||||
PageMap->PtePointer = (PVOID)(UINT_PTR)Address;
|
PageMap->PtePointer = (PVOID)(UINT_PTR)Address;
|
||||||
RTL::Memory::ZeroMemory(PageMap->PtePointer, EFI_PAGE_SIZE);
|
RTL::Memory::ZeroMemory(PageMap->PtePointer, EFI_PAGE_SIZE);
|
||||||
@@ -167,28 +144,6 @@ Memory::BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
|||||||
return STATUS_EFI_PROTOCOL_ERROR;
|
return STATUS_EFI_PROTOCOL_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return success */
|
|
||||||
return STATUS_EFI_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Iterates through the memory map and physically maps all virtual addresses to page tables.
|
|
||||||
*
|
|
||||||
* @param PageMap
|
|
||||||
* Supplies a pointer to the page mapping structure.
|
|
||||||
*
|
|
||||||
* @return This routine returns a status code.
|
|
||||||
*
|
|
||||||
* @since XT 1.0
|
|
||||||
*/
|
|
||||||
XTCDECL
|
|
||||||
EFI_STATUS
|
|
||||||
Memory::CommitPageMap(IN PXTBL_PAGE_MAPPING PageMap)
|
|
||||||
{
|
|
||||||
PXTBL_MEMORY_MAPPING Mapping;
|
|
||||||
PLIST_ENTRY ListEntry;
|
|
||||||
EFI_STATUS Status;
|
|
||||||
|
|
||||||
/* Iterate through and map all the mappings*/
|
/* Iterate through and map all the mappings*/
|
||||||
Debug::Print(L"Mapping and dumping EFI memory:\n");
|
Debug::Print(L"Mapping and dumping EFI memory:\n");
|
||||||
ListEntry = PageMap->MemoryMap.Flink;
|
ListEntry = PageMap->MemoryMap.Flink;
|
||||||
|
|||||||
@@ -165,7 +165,6 @@ class Memory
|
|||||||
OUT PVOID *Memory);
|
OUT PVOID *Memory);
|
||||||
STATIC XTCDECL EFI_STATUS BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
STATIC XTCDECL EFI_STATUS BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
||||||
IN ULONG_PTR SelfMapAddress);
|
IN ULONG_PTR SelfMapAddress);
|
||||||
STATIC XTCDECL EFI_STATUS CommitPageMap(IN PXTBL_PAGE_MAPPING PageMap);
|
|
||||||
STATIC XTCDECL EFI_STATUS FreePages(IN ULONGLONG NumberOfPages,
|
STATIC XTCDECL EFI_STATUS FreePages(IN ULONGLONG NumberOfPages,
|
||||||
IN EFI_PHYSICAL_ADDRESS Memory);
|
IN EFI_PHYSICAL_ADDRESS Memory);
|
||||||
STATIC XTCDECL EFI_STATUS FreePool(IN PVOID Memory);
|
STATIC XTCDECL EFI_STATUS FreePool(IN PVOID Memory);
|
||||||
|
|||||||
@@ -10,34 +10,6 @@
|
|||||||
#include <xtos.hh>
|
#include <xtos.hh>
|
||||||
|
|
||||||
|
|
||||||
XTCDECL
|
|
||||||
EFI_STATUS
|
|
||||||
Xtos::BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap)
|
|
||||||
{
|
|
||||||
EFI_STATUS Status;
|
|
||||||
|
|
||||||
/* Build page map */
|
|
||||||
Status = XtLdrProtocol->Memory.BuildPageMap(PageMap, (PageMap->PageMapLevel > 4) ? MM_P5E_LA57_BASE : MM_PXE_BASE);
|
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
|
||||||
{
|
|
||||||
/* Failed to build page map */
|
|
||||||
XtLdrProtocol->Debug.Print(L"Failed to build page map (Status code: %zX)\n", Status);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Map memory for hardware layer */
|
|
||||||
Status = MapHardwareMemoryPool(PageMap);
|
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
|
||||||
{
|
|
||||||
/* Failed to map memory for hardware layer */
|
|
||||||
XtLdrProtocol->Debug.Print(L"Failed to map memory for hardware leyer (Status code: %zX)\n", Status);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return success */
|
|
||||||
return STATUS_EFI_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines the appropriate EFI memory mapping strategy for the AMD64 architecture.
|
* Determines the appropriate EFI memory mapping strategy for the AMD64 architecture.
|
||||||
*
|
*
|
||||||
@@ -119,6 +91,24 @@ Xtos::EnablePaging(IN PXTBL_PAGE_MAPPING PageMap)
|
|||||||
ULONG_PTR TrampolineSize;
|
ULONG_PTR TrampolineSize;
|
||||||
PVOID TrampolineCode;
|
PVOID TrampolineCode;
|
||||||
|
|
||||||
|
/* Build page map */
|
||||||
|
Status = XtLdrProtocol->Memory.BuildPageMap(PageMap, (PageMap->PageMapLevel > 4) ? MM_P5E_LA57_BASE : MM_PXE_BASE);
|
||||||
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
|
{
|
||||||
|
/* Failed to build page map */
|
||||||
|
XtLdrProtocol->Debug.Print(L"Failed to build page map (Status code: %zX)\n", Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Map memory for hardware layer */
|
||||||
|
Status = MapHardwareMemoryPool(PageMap);
|
||||||
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
|
{
|
||||||
|
/* Failed to map memory for hardware layer */
|
||||||
|
XtLdrProtocol->Debug.Print(L"Failed to map memory for hardware leyer (Status code: %zX)\n", Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
/* Check the configured page map level to set the LA57 state accordingly */
|
/* Check the configured page map level to set the LA57 state accordingly */
|
||||||
if(PageMap->PageMapLevel == 5)
|
if(PageMap->PageMapLevel == 5)
|
||||||
{
|
{
|
||||||
@@ -198,7 +188,6 @@ Xtos::MapHardwareMemoryPool(IN PXTBL_PAGE_MAPPING PageMap)
|
|||||||
PHARDWARE_PTE P5eBase, PdeBase, PpeBase, PxeBase;
|
PHARDWARE_PTE P5eBase, PdeBase, PpeBase, PxeBase;
|
||||||
EFI_PHYSICAL_ADDRESS Address;
|
EFI_PHYSICAL_ADDRESS Address;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
ULONG Index;
|
|
||||||
|
|
||||||
if(PageMap->PageMapLevel == 5)
|
if(PageMap->PageMapLevel == 5)
|
||||||
{
|
{
|
||||||
@@ -216,9 +205,6 @@ Xtos::MapHardwareMemoryPool(IN PXTBL_PAGE_MAPPING PageMap)
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Map hardware memory */
|
|
||||||
XtLdrProtocol->Memory.MapVirtualMemory(PageMap, (ULONGLONG)NULLPTR, Address, 1, LoaderMemoryData);
|
|
||||||
|
|
||||||
/* Zero fill memory used by P5E */
|
/* Zero fill memory used by P5E */
|
||||||
XtLdrProtocol->Memory.ZeroMemory((PVOID)Address, EFI_PAGE_SIZE);
|
XtLdrProtocol->Memory.ZeroMemory((PVOID)Address, EFI_PAGE_SIZE);
|
||||||
|
|
||||||
@@ -253,9 +239,6 @@ Xtos::MapHardwareMemoryPool(IN PXTBL_PAGE_MAPPING PageMap)
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Map hardware memory */
|
|
||||||
XtLdrProtocol->Memory.MapVirtualMemory(PageMap, (ULONGLONG)NULLPTR, Address, 1, LoaderMemoryData);
|
|
||||||
|
|
||||||
/* Zero fill memory used by PXE */
|
/* Zero fill memory used by PXE */
|
||||||
XtLdrProtocol->Memory.ZeroMemory((PVOID)Address, EFI_PAGE_SIZE);
|
XtLdrProtocol->Memory.ZeroMemory((PVOID)Address, EFI_PAGE_SIZE);
|
||||||
|
|
||||||
@@ -284,9 +267,6 @@ Xtos::MapHardwareMemoryPool(IN PXTBL_PAGE_MAPPING PageMap)
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Map hardware memory */
|
|
||||||
XtLdrProtocol->Memory.MapVirtualMemory(PageMap, (ULONGLONG)NULLPTR, Address, 1, LoaderMemoryData);
|
|
||||||
|
|
||||||
/* Zero fill memory used by PPE */
|
/* Zero fill memory used by PPE */
|
||||||
XtLdrProtocol->Memory.ZeroMemory((PVOID)Address, EFI_PAGE_SIZE);
|
XtLdrProtocol->Memory.ZeroMemory((PVOID)Address, EFI_PAGE_SIZE);
|
||||||
|
|
||||||
@@ -305,7 +285,7 @@ Xtos::MapHardwareMemoryPool(IN PXTBL_PAGE_MAPPING PageMap)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Loop through 2 PDE entries */
|
/* Loop through 2 PDE entries */
|
||||||
for(Index = 0 ; Index < 2 ; Index++)
|
for(UINT Index = 0 ; Index < 2 ; Index++)
|
||||||
{
|
{
|
||||||
/* Check if PDE entry already exists */
|
/* Check if PDE entry already exists */
|
||||||
if(!PdeBase[((MM_HARDWARE_VA_START >> MM_PDI_SHIFT) & 0x1FF) + Index].Valid)
|
if(!PdeBase[((MM_HARDWARE_VA_START >> MM_PDI_SHIFT) & 0x1FF) + Index].Valid)
|
||||||
@@ -318,9 +298,6 @@ Xtos::MapHardwareMemoryPool(IN PXTBL_PAGE_MAPPING PageMap)
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Map hardware memory */
|
|
||||||
XtLdrProtocol->Memory.MapVirtualMemory(PageMap, (ULONGLONG)NULLPTR, Address, 1, LoaderMemoryData);
|
|
||||||
|
|
||||||
/* Zero fill memory used by PDE */
|
/* Zero fill memory used by PDE */
|
||||||
XtLdrProtocol->Memory.ZeroMemory((PVOID)Address, EFI_PAGE_SIZE);
|
XtLdrProtocol->Memory.ZeroMemory((PVOID)Address, EFI_PAGE_SIZE);
|
||||||
|
|
||||||
|
|||||||
@@ -9,47 +9,6 @@
|
|||||||
#include <xtos.hh>
|
#include <xtos.hh>
|
||||||
|
|
||||||
|
|
||||||
XTCDECL
|
|
||||||
EFI_STATUS
|
|
||||||
Xtos::BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap)
|
|
||||||
{
|
|
||||||
ULONG_PTR SelfMapAddress;
|
|
||||||
EFI_STATUS Status;
|
|
||||||
|
|
||||||
/* Initialize self map address */
|
|
||||||
if(PageMap->PageMapLevel == 3)
|
|
||||||
{
|
|
||||||
/* For PML3 (PAE) use PTE base address */
|
|
||||||
SelfMapAddress = MM_PTE_BASE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* For PML2 (PAE disabled) use legacy PDE base address */
|
|
||||||
SelfMapAddress = MM_PDE_LEGACY_BASE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Build page map */
|
|
||||||
Status = XtLdrProtocol->Memory.BuildPageMap(PageMap, SelfMapAddress);
|
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
|
||||||
{
|
|
||||||
/* Failed to build page map */
|
|
||||||
XtLdrProtocol->Debug.Print(L"Failed to build page map (Status code: %zX)\n", Status);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Map memory for hardware layer */
|
|
||||||
Status = MapHardwareMemoryPool(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);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return success */
|
|
||||||
return STATUS_EFI_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines the appropriate EFI memory mapping strategy for the i686 architecture.
|
* Determines the appropriate EFI memory mapping strategy for the i686 architecture.
|
||||||
*
|
*
|
||||||
@@ -115,6 +74,37 @@ EFI_STATUS
|
|||||||
Xtos::EnablePaging(IN PXTBL_PAGE_MAPPING PageMap)
|
Xtos::EnablePaging(IN PXTBL_PAGE_MAPPING PageMap)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
ULONG_PTR SelfMapAddress;
|
||||||
|
|
||||||
|
/* Initialize self map address */
|
||||||
|
if(PageMap->PageMapLevel == 3)
|
||||||
|
{
|
||||||
|
/* For PML3 (PAE) use PTE base address */
|
||||||
|
SelfMapAddress = MM_PTE_BASE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* For PML2 (PAE disabled) use legacy PDE base address */
|
||||||
|
SelfMapAddress = MM_PDE_LEGACY_BASE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Build page map */
|
||||||
|
Status = XtLdrProtocol->Memory.BuildPageMap(PageMap, SelfMapAddress);
|
||||||
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
|
{
|
||||||
|
/* Failed to build page map */
|
||||||
|
XtLdrProtocol->Debug.Print(L"Failed to build page map (Status code: %zX)\n", Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Map memory for hardware layer */
|
||||||
|
Status = MapHardwareMemoryPool(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);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
/* Exit EFI Boot Services */
|
/* Exit EFI Boot Services */
|
||||||
XtLdrProtocol->Debug.Print(L"Exiting EFI boot services\n");
|
XtLdrProtocol->Debug.Print(L"Exiting EFI boot services\n");
|
||||||
@@ -183,9 +173,6 @@ Xtos::MapHardwareMemoryPool(IN PXTBL_PAGE_MAPPING PageMap)
|
|||||||
/* Zero fill allocated memory */
|
/* Zero fill allocated memory */
|
||||||
XtLdrProtocol->Memory.ZeroMemory((PVOID)Address, EFI_PAGE_SIZE);
|
XtLdrProtocol->Memory.ZeroMemory((PVOID)Address, EFI_PAGE_SIZE);
|
||||||
|
|
||||||
/* Map hardware memory */
|
|
||||||
XtLdrProtocol->Memory.MapVirtualMemory(PageMap, (ULONGLONG)NULLPTR, Address, 1, LoaderMemoryData);
|
|
||||||
|
|
||||||
/* Check if PAE is enabled (3-level paging) */
|
/* Check if PAE is enabled (3-level paging) */
|
||||||
if(PageMap->PageMapLevel == 3)
|
if(PageMap->PageMapLevel == 3)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -38,7 +38,6 @@ class Xtos
|
|||||||
IN PVOID PhysicalAddress,
|
IN PVOID PhysicalAddress,
|
||||||
IN UINT NumberOfPages,
|
IN UINT NumberOfPages,
|
||||||
IN LOADER_MEMORY_TYPE MemoryType);
|
IN LOADER_MEMORY_TYPE MemoryType);
|
||||||
STATIC XTCDECL EFI_STATUS BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap);
|
|
||||||
STATIC XTCDECL LOADER_MEMORY_TYPE ConvertEfiMemoryType(IN EFI_MEMORY_TYPE EfiMemoryType);
|
STATIC XTCDECL LOADER_MEMORY_TYPE ConvertEfiMemoryType(IN EFI_MEMORY_TYPE EfiMemoryType);
|
||||||
STATIC XTCDECL BOOLEAN DetermineMappingStrategy();
|
STATIC XTCDECL BOOLEAN DetermineMappingStrategy();
|
||||||
STATIC XTCDECL ULONG DeterminePagingLevel(IN CONST PWCHAR Parameters);
|
STATIC XTCDECL ULONG DeterminePagingLevel(IN CONST PWCHAR Parameters);
|
||||||
@@ -48,13 +47,10 @@ class Xtos
|
|||||||
IN PULONG_PTR FrameBufferSize,
|
IN PULONG_PTR FrameBufferSize,
|
||||||
IN PXTBL_FRAMEBUFFER_MODE_INFORMATION FrameBufferModeInfo);
|
IN PXTBL_FRAMEBUFFER_MODE_INFORMATION FrameBufferModeInfo);
|
||||||
STATIC XTCDECL EFI_STATUS GetMemoryDescriptorList(IN PXTBL_PAGE_MAPPING PageMap,
|
STATIC XTCDECL EFI_STATUS GetMemoryDescriptorList(IN PXTBL_PAGE_MAPPING PageMap,
|
||||||
IN EFI_PHYSICAL_ADDRESS PhysicalBase,
|
IN PVOID *VirtualAddress,
|
||||||
IN PVOID VirtualBase,
|
|
||||||
OUT PLIST_ENTRY MemoryDescriptorList);
|
OUT PLIST_ENTRY MemoryDescriptorList);
|
||||||
STATIC XTCDECL EFI_STATUS GetSystemResourcesList(IN PXTBL_PAGE_MAPPING PageMap,
|
STATIC XTCDECL EFI_STATUS GetSystemResourcesList(IN PXTBL_PAGE_MAPPING PageMap,
|
||||||
IN EFI_PHYSICAL_ADDRESS PhysicalBase,
|
IN PVOID *VirtualAddress,
|
||||||
IN PVOID VirtualBase,
|
|
||||||
IN PVOID FrameBufferVirtualBase,
|
|
||||||
OUT PLIST_ENTRY SystemResourcesList);
|
OUT PLIST_ENTRY SystemResourcesList);
|
||||||
STATIC XTCDECL EFI_STATUS GetVirtualAddress(IN PLIST_ENTRY MemoryMappings,
|
STATIC XTCDECL EFI_STATUS GetVirtualAddress(IN PLIST_ENTRY MemoryMappings,
|
||||||
IN PVOID PhysicalAddress,
|
IN PVOID PhysicalAddress,
|
||||||
|
|||||||
@@ -191,16 +191,38 @@ Xtos::GetDisplayInformation(OUT PSYSTEM_RESOURCE_FRAMEBUFFER FrameBufferResource
|
|||||||
XTCDECL
|
XTCDECL
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
Xtos::GetMemoryDescriptorList(IN PXTBL_PAGE_MAPPING PageMap,
|
Xtos::GetMemoryDescriptorList(IN PXTBL_PAGE_MAPPING PageMap,
|
||||||
IN EFI_PHYSICAL_ADDRESS PhysicalBase,
|
IN PVOID *VirtualAddress,
|
||||||
IN PVOID VirtualBase,
|
|
||||||
OUT PLIST_ENTRY MemoryDescriptorList)
|
OUT PLIST_ENTRY MemoryDescriptorList)
|
||||||
{
|
{
|
||||||
PLOADER_MEMORY_DESCRIPTOR Descriptor;
|
PLOADER_MEMORY_DESCRIPTOR Descriptor;
|
||||||
PXTBL_MEMORY_MAPPING MemoryMapping;
|
PXTBL_MEMORY_MAPPING MemoryMapping;
|
||||||
|
EFI_PHYSICAL_ADDRESS Address;
|
||||||
PLIST_ENTRY ListEntry;
|
PLIST_ENTRY ListEntry;
|
||||||
|
EFI_STATUS Status;
|
||||||
|
ULONGLONG Pages;
|
||||||
|
|
||||||
|
/* Calculate the number of pages required to store the memory descriptor array */
|
||||||
|
Pages = (ULONGLONG)EFI_SIZE_TO_PAGES((PageMap->MapSize + 1) * sizeof(LOADER_MEMORY_DESCRIPTOR));
|
||||||
|
|
||||||
|
/* Allocate physical pages to hold the memory descriptor list */
|
||||||
|
Status = XtLdrProtocol->Memory.AllocatePages(AllocateAnyPages, Pages, &Address);
|
||||||
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
|
{
|
||||||
|
/* Page allocation failed, return the status code */
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create a virtual memory mapping for the allocated descriptor buffer */
|
||||||
|
Status = XtLdrProtocol->Memory.MapVirtualMemory(PageMap, (ULONGLONG)*VirtualAddress, Address, Pages, LoaderMemoryData);
|
||||||
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
|
{
|
||||||
|
/* Release the allocated pages as the virtual mapping failed and return status code */
|
||||||
|
XtLdrProtocol->Memory.FreePages(Address, Pages);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
/* Initialize the descriptor pointer to the start of the allocated physical buffer */
|
/* Initialize the descriptor pointer to the start of the allocated physical buffer */
|
||||||
Descriptor = (PLOADER_MEMORY_DESCRIPTOR)PhysicalBase;
|
Descriptor = (PLOADER_MEMORY_DESCRIPTOR)Address;
|
||||||
|
|
||||||
/* Get the first entry from the internal boot loader memory map */
|
/* Get the first entry from the internal boot loader memory map */
|
||||||
ListEntry = PageMap->MemoryMap.Flink;
|
ListEntry = PageMap->MemoryMap.Flink;
|
||||||
@@ -225,18 +247,17 @@ Xtos::GetMemoryDescriptorList(IN PXTBL_PAGE_MAPPING PageMap,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Convert all physical link pointers in the list to their corresponding virtual addresses */
|
/* Convert all physical link pointers in the list to their corresponding virtual addresses */
|
||||||
XtLdrProtocol->Memory.PhysicalListToVirtual(PageMap, MemoryDescriptorList, (PVOID)PhysicalBase, VirtualBase);
|
XtLdrProtocol->Memory.PhysicalListToVirtual(PageMap, MemoryDescriptorList, (PVOID)Address, *VirtualAddress);
|
||||||
|
|
||||||
/* Return success */
|
/* Advance the virtual address pointer to the next available free region and return success */
|
||||||
|
*VirtualAddress = (PUINT8)*VirtualAddress + (Pages * EFI_PAGE_SIZE);
|
||||||
return STATUS_EFI_SUCCESS;
|
return STATUS_EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
XTCDECL
|
XTCDECL
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
Xtos::GetSystemResourcesList(IN PXTBL_PAGE_MAPPING PageMap,
|
Xtos::GetSystemResourcesList(IN PXTBL_PAGE_MAPPING PageMap,
|
||||||
IN EFI_PHYSICAL_ADDRESS PhysicalBase,
|
IN PVOID *VirtualAddress,
|
||||||
IN PVOID VirtualBase,
|
|
||||||
IN PVOID FrameBufferVirtualBase,
|
|
||||||
OUT PLIST_ENTRY SystemResourcesList)
|
OUT PLIST_ENTRY SystemResourcesList)
|
||||||
{
|
{
|
||||||
XTSTATUS Status;
|
XTSTATUS Status;
|
||||||
@@ -247,18 +268,39 @@ Xtos::GetSystemResourcesList(IN PXTBL_PAGE_MAPPING PageMap,
|
|||||||
PXTBL_FRAMEBUFFER_PROTOCOL FrameBufProtocol;
|
PXTBL_FRAMEBUFFER_PROTOCOL FrameBufProtocol;
|
||||||
XTBL_FRAMEBUFFER_MODE_INFORMATION FbModeInfo;
|
XTBL_FRAMEBUFFER_MODE_INFORMATION FbModeInfo;
|
||||||
EFI_PHYSICAL_ADDRESS FbAddress;
|
EFI_PHYSICAL_ADDRESS FbAddress;
|
||||||
EFI_PHYSICAL_ADDRESS OriginalPhysicalBase;
|
|
||||||
ULONG_PTR FbSize;
|
ULONG_PTR FbSize;
|
||||||
|
UINT FrameBufferPages;
|
||||||
PSYSTEM_RESOURCE_FRAMEBUFFER FrameBufferResource;
|
PSYSTEM_RESOURCE_FRAMEBUFFER FrameBufferResource;
|
||||||
PSYSTEM_RESOURCE_ACPI AcpiResource;
|
PSYSTEM_RESOURCE_ACPI AcpiResource;
|
||||||
|
ULONGLONG Pages;
|
||||||
|
EFI_PHYSICAL_ADDRESS Address;
|
||||||
|
PVOID PhysicalBase, VirtualBase;
|
||||||
|
|
||||||
/* Save original physical base */
|
Pages = (ULONGLONG)EFI_SIZE_TO_PAGES(sizeof(SYSTEM_RESOURCE_ACPI) + sizeof(SYSTEM_RESOURCE_FRAMEBUFFER));
|
||||||
OriginalPhysicalBase = PhysicalBase;
|
|
||||||
|
Status = XtLdrProtocol->Memory.AllocatePages(AllocateAnyPages, Pages, &Address);
|
||||||
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
|
{
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
Status = XtLdrProtocol->Memory.MapVirtualMemory(PageMap, (ULONGLONG)*VirtualAddress, Address, Pages, LoaderFirmwarePermanent);
|
||||||
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
|
{
|
||||||
|
XtLdrProtocol->Memory.FreePages(Address, Pages);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
PhysicalBase = (PVOID)Address;
|
||||||
|
VirtualBase = *VirtualAddress;
|
||||||
|
|
||||||
|
/* Calculate next valid virtual address */
|
||||||
|
*VirtualAddress = (PUINT8)*VirtualAddress + (Pages * EFI_PAGE_SIZE);
|
||||||
|
|
||||||
|
AcpiResource = (PSYSTEM_RESOURCE_ACPI)Address;
|
||||||
|
|
||||||
AcpiResource = (PSYSTEM_RESOURCE_ACPI)PhysicalBase;
|
|
||||||
XtLdrProtocol->Memory.ZeroMemory(AcpiResource, sizeof(SYSTEM_RESOURCE_ACPI));
|
XtLdrProtocol->Memory.ZeroMemory(AcpiResource, sizeof(SYSTEM_RESOURCE_ACPI));
|
||||||
|
|
||||||
/* Load ACPI protocol */
|
/* Load FrameBuffer protocol */
|
||||||
Status = XtLdrProtocol->Protocol.Open(&ProtocolHandle, (PVOID*)&AcpiProtocol, &AcpiGuid);
|
Status = XtLdrProtocol->Protocol.Open(&ProtocolHandle, (PVOID*)&AcpiProtocol, &AcpiGuid);
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
{
|
{
|
||||||
@@ -277,11 +319,13 @@ Xtos::GetSystemResourcesList(IN PXTBL_PAGE_MAPPING PageMap,
|
|||||||
|
|
||||||
XtLdrProtocol->LinkedList.InsertTail(SystemResourcesList, &AcpiResource->Header.ListEntry);
|
XtLdrProtocol->LinkedList.InsertTail(SystemResourcesList, &AcpiResource->Header.ListEntry);
|
||||||
|
|
||||||
/* Close ACPI protocol */
|
/* Close FrameBuffer protocol */
|
||||||
XtLdrProtocol->Protocol.Close(&ProtocolHandle, &AcpiGuid);
|
XtLdrProtocol->Protocol.Close(&ProtocolHandle, &FrameBufGuid);
|
||||||
|
|
||||||
|
Address = Address + sizeof(SYSTEM_RESOURCE_ACPI);
|
||||||
|
|
||||||
|
FrameBufferResource = (PSYSTEM_RESOURCE_FRAMEBUFFER)Address;
|
||||||
|
|
||||||
PhysicalBase = PhysicalBase + sizeof(SYSTEM_RESOURCE_ACPI);
|
|
||||||
FrameBufferResource = (PSYSTEM_RESOURCE_FRAMEBUFFER)PhysicalBase;
|
|
||||||
XtLdrProtocol->Memory.ZeroMemory(FrameBufferResource, sizeof(SYSTEM_RESOURCE_FRAMEBUFFER));
|
XtLdrProtocol->Memory.ZeroMemory(FrameBufferResource, sizeof(SYSTEM_RESOURCE_FRAMEBUFFER));
|
||||||
|
|
||||||
/* Load FrameBuffer protocol */
|
/* Load FrameBuffer protocol */
|
||||||
@@ -302,16 +346,26 @@ Xtos::GetSystemResourcesList(IN PXTBL_PAGE_MAPPING PageMap,
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Assign the pre-mapped virtual address to the resource block */
|
/* Calculate pages needed to map framebuffer */
|
||||||
FrameBufferResource->Header.VirtualAddress = FrameBufferVirtualBase;
|
FrameBufferPages = EFI_SIZE_TO_PAGES(FbSize);
|
||||||
|
|
||||||
|
/* Rewrite framebuffer address by using virtual address */
|
||||||
|
FrameBufferResource->Header.VirtualAddress = *VirtualAddress;
|
||||||
|
|
||||||
|
/* Map frame buffer memory */
|
||||||
|
XtLdrProtocol->Memory.MapVirtualMemory(PageMap, (ULONGLONG)FrameBufferResource->Header.VirtualAddress,
|
||||||
|
(ULONGLONG)FrameBufferResource->Header.PhysicalAddress,
|
||||||
|
FrameBufferPages, LoaderFirmwarePermanent);
|
||||||
|
|
||||||
|
/* Close FrameBuffer protocol */
|
||||||
XtLdrProtocol->Protocol.Close(&ProtocolHandle, &FrameBufGuid);
|
XtLdrProtocol->Protocol.Close(&ProtocolHandle, &FrameBufGuid);
|
||||||
|
|
||||||
|
*VirtualAddress = (PUINT8)*VirtualAddress + (FrameBufferPages * EFI_PAGE_SIZE);
|
||||||
|
|
||||||
XtLdrProtocol->LinkedList.InsertTail(SystemResourcesList, &FrameBufferResource->Header.ListEntry);
|
XtLdrProtocol->LinkedList.InsertTail(SystemResourcesList, &FrameBufferResource->Header.ListEntry);
|
||||||
|
|
||||||
/* Convert list pointers to virtual */
|
XtLdrProtocol->Memory.PhysicalListToVirtual(PageMap, SystemResourcesList, PhysicalBase, VirtualBase);
|
||||||
XtLdrProtocol->Memory.PhysicalListToVirtual(PageMap, SystemResourcesList, (PVOID)OriginalPhysicalBase, VirtualBase);
|
|
||||||
|
|
||||||
/* Return success */
|
|
||||||
return STATUS_EFI_SUCCESS;
|
return STATUS_EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -372,97 +426,34 @@ Xtos::InitializeApicBase(IN PXTBL_PAGE_MAPPING PageMap)
|
|||||||
XTCDECL
|
XTCDECL
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
Xtos::InitializeLoaderBlock(IN PXTBL_PAGE_MAPPING PageMap,
|
Xtos::InitializeLoaderBlock(IN PXTBL_PAGE_MAPPING PageMap,
|
||||||
IN OUT PVOID *VirtualAddress,
|
IN PVOID *VirtualAddress,
|
||||||
IN PXTBL_BOOT_PARAMETERS Parameters)
|
IN PXTBL_BOOT_PARAMETERS Parameters)
|
||||||
{
|
{
|
||||||
EFI_PHYSICAL_ADDRESS FbPhysicalAddress, PhysicalBlock, PhysicalDescriptor, PhysicalResources;
|
|
||||||
PVOID FbVirtualAddress, VirtualBlock, VirtualResources, VirtualDescriptor;
|
|
||||||
UINT BlockPages, DescriptorPages, FbPages, ParametersSize, ResourcesPages;
|
|
||||||
XTBL_FRAMEBUFFER_MODE_INFORMATION FbModeInfo;
|
|
||||||
PXTBL_FRAMEBUFFER_PROTOCOL FrameBufProtocol;
|
|
||||||
PKERNEL_INITIALIZATION_BLOCK LoaderBlock;
|
PKERNEL_INITIALIZATION_BLOCK LoaderBlock;
|
||||||
EFI_HANDLE ProtocolHandle;
|
EFI_PHYSICAL_ADDRESS Address;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
ULONG_PTR FbSize;
|
UINT BlockPages;
|
||||||
|
UINT ParametersSize;
|
||||||
EFI_GUID FrameBufGuid = XT_FRAMEBUFFER_PROTOCOL_GUID;
|
|
||||||
|
|
||||||
/* Initialize Framebuffer information */
|
|
||||||
FbPhysicalAddress = 0;
|
|
||||||
FbSize = 0;
|
|
||||||
FbVirtualAddress = NULLPTR;
|
|
||||||
FbPages = 0;
|
|
||||||
|
|
||||||
/* Calculate size of parameters */
|
/* Calculate size of parameters */
|
||||||
ParametersSize = (XtLdrProtocol->WideString.Length(Parameters->Parameters, 0) + 1) * sizeof(WCHAR);
|
ParametersSize = (XtLdrProtocol->WideString.Length(Parameters->Parameters, 0) + 1) * sizeof(WCHAR);
|
||||||
|
|
||||||
/* Calculate number of pages needed for initialization block */
|
/* Calculate number of pages needed for initialization block */
|
||||||
BlockPages = EFI_SIZE_TO_PAGES(sizeof(KERNEL_INITIALIZATION_BLOCK) + ParametersSize);
|
BlockPages = EFI_SIZE_TO_PAGES(sizeof(KERNEL_INITIALIZATION_BLOCK) + ParametersSize);
|
||||||
ResourcesPages = EFI_SIZE_TO_PAGES(sizeof(SYSTEM_RESOURCE_ACPI) + sizeof(SYSTEM_RESOURCE_FRAMEBUFFER));
|
|
||||||
|
|
||||||
/* Query Framebuffer size for allocation */
|
/* Allocate memory for kernel initialization block */
|
||||||
if(XtLdrProtocol->Protocol.Open(&ProtocolHandle, (PVOID*)&FrameBufProtocol, &FrameBufGuid) == STATUS_EFI_SUCCESS)
|
Status = XtLdrProtocol->Memory.AllocatePages(AllocateAnyPages, BlockPages, &Address);
|
||||||
{
|
|
||||||
/* Get FrameBuffer information */
|
|
||||||
FrameBufProtocol->GetDisplayInformation(&FbPhysicalAddress, &FbSize, &FbModeInfo);
|
|
||||||
XtLdrProtocol->Protocol.Close(&ProtocolHandle, &FrameBufGuid);
|
|
||||||
}
|
|
||||||
FbPages = EFI_SIZE_TO_PAGES(FbSize);
|
|
||||||
|
|
||||||
/* Calculate number of pages needed for memory descriptor list */
|
|
||||||
DescriptorPages = EFI_SIZE_TO_PAGES(PageMap->MapSize * sizeof(LOADER_MEMORY_DESCRIPTOR));
|
|
||||||
|
|
||||||
/* Allocate memory for the kernel initialization block and boot parameters */
|
|
||||||
Status = XtLdrProtocol->Memory.AllocatePages(AllocateAnyPages, BlockPages, &PhysicalBlock);
|
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
{
|
{
|
||||||
/* Memory allocation failure, return status code */
|
/* Memory allocation failure */
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allocate memory for the system resources data structures */
|
/* Initialize and zero-fill kernel initialization block */
|
||||||
Status = XtLdrProtocol->Memory.AllocatePages(AllocateAnyPages, ResourcesPages, &PhysicalResources);
|
LoaderBlock = (PKERNEL_INITIALIZATION_BLOCK)(UINT_PTR)Address;
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
XtLdrProtocol->Memory.ZeroMemory(LoaderBlock, sizeof(KERNEL_INITIALIZATION_BLOCK) + ParametersSize);
|
||||||
{
|
|
||||||
/* Memory allocation failure, return status code */
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Allocate memory for the memory descriptor list */
|
|
||||||
Status = XtLdrProtocol->Memory.AllocatePages(AllocateAnyPages, DescriptorPages, &PhysicalDescriptor);
|
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
|
||||||
{
|
|
||||||
/* Memory allocation failure, return status code */
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Map the Kernel Initialization Block into virtual memory and advance the virtual address pointer */
|
|
||||||
VirtualBlock = *VirtualAddress;
|
|
||||||
XtLdrProtocol->Memory.MapVirtualMemory(PageMap, (ULONGLONG)VirtualBlock, PhysicalBlock, BlockPages, LoaderSystemBlock);
|
|
||||||
*VirtualAddress = (PUINT8)*VirtualAddress + (BlockPages * EFI_PAGE_SIZE);
|
|
||||||
|
|
||||||
/* Map the system resources physical memory into virtual address space and update the allocation pointer */
|
|
||||||
VirtualResources = *VirtualAddress;
|
|
||||||
XtLdrProtocol->Memory.MapVirtualMemory(PageMap, (ULONGLONG)VirtualResources, PhysicalResources, ResourcesPages, LoaderFirmwarePermanent);
|
|
||||||
*VirtualAddress = (PUINT8)*VirtualAddress + (ResourcesPages * EFI_PAGE_SIZE);
|
|
||||||
|
|
||||||
/* Check if a framebuffer was detected and requires memory mapping */
|
|
||||||
if(FbPages > 0)
|
|
||||||
{
|
|
||||||
/* Map the framebuffer physical memory range into virtual address space */
|
|
||||||
FbVirtualAddress = *VirtualAddress;
|
|
||||||
XtLdrProtocol->Memory.MapVirtualMemory(PageMap, (ULONGLONG)FbVirtualAddress, FbPhysicalAddress, FbPages, LoaderFirmwarePermanent);
|
|
||||||
*VirtualAddress = (PUINT8)*VirtualAddress + (FbPages * EFI_PAGE_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Map the allocated physical memory for memory descriptors into the virtual address space */
|
|
||||||
VirtualDescriptor = *VirtualAddress;
|
|
||||||
XtLdrProtocol->Memory.MapVirtualMemory(PageMap, (ULONGLONG)VirtualDescriptor, PhysicalDescriptor, DescriptorPages, LoaderMemoryData);
|
|
||||||
*VirtualAddress = (PUINT8)*VirtualAddress + (DescriptorPages * EFI_PAGE_SIZE);
|
|
||||||
|
|
||||||
/* Set basic loader block properties */
|
/* Set basic loader block properties */
|
||||||
XtLdrProtocol->Memory.ZeroMemory((PVOID)PhysicalBlock, sizeof(KERNEL_INITIALIZATION_BLOCK) + ParametersSize);
|
|
||||||
LoaderBlock = (PKERNEL_INITIALIZATION_BLOCK)PhysicalBlock;
|
|
||||||
LoaderBlock->BlockSize = sizeof(KERNEL_INITIALIZATION_BLOCK);
|
LoaderBlock->BlockSize = sizeof(KERNEL_INITIALIZATION_BLOCK);
|
||||||
LoaderBlock->BlockVersion = INITIALIZATION_BLOCK_VERSION;
|
LoaderBlock->BlockVersion = INITIALIZATION_BLOCK_VERSION;
|
||||||
LoaderBlock->ProtocolVersion = BOOT_PROTOCOL_VERSION;
|
LoaderBlock->ProtocolVersion = BOOT_PROTOCOL_VERSION;
|
||||||
@@ -476,30 +467,24 @@ Xtos::InitializeLoaderBlock(IN PXTBL_PAGE_MAPPING PageMap,
|
|||||||
LoaderBlock->FirmwareInformation.EfiFirmware.EfiRuntimeServices = NULLPTR;
|
LoaderBlock->FirmwareInformation.EfiFirmware.EfiRuntimeServices = NULLPTR;
|
||||||
|
|
||||||
/* Copy parameters to kernel initialization block */
|
/* Copy parameters to kernel initialization block */
|
||||||
LoaderBlock->KernelParameters = (PWCHAR)((UINT_PTR)VirtualBlock + sizeof(KERNEL_INITIALIZATION_BLOCK));
|
LoaderBlock->KernelParameters = (PWCHAR)((UINT_PTR)*VirtualAddress + sizeof(KERNEL_INITIALIZATION_BLOCK));
|
||||||
XtLdrProtocol->Memory.CopyMemory((PVOID)((UINT_PTR)LoaderBlock + sizeof(KERNEL_INITIALIZATION_BLOCK)),
|
XtLdrProtocol->Memory.CopyMemory((PVOID)((UINT_PTR)LoaderBlock + sizeof(KERNEL_INITIALIZATION_BLOCK)),
|
||||||
Parameters->Parameters, ParametersSize);
|
Parameters->Parameters,
|
||||||
|
ParametersSize);
|
||||||
|
|
||||||
/* Commit mappings */
|
/* Map kernel initialization block */
|
||||||
XtLdrProtocol->Memory.CommitPageMap(PageMap);
|
XtLdrProtocol->Memory.MapVirtualMemory(PageMap, (ULONGLONG)*VirtualAddress, (ULONGLONG)LoaderBlock,
|
||||||
|
BlockPages, LoaderSystemBlock);
|
||||||
|
|
||||||
|
/* Calculate next valid virtual address */
|
||||||
|
*VirtualAddress = (PUINT8)*VirtualAddress + (BlockPages * EFI_PAGE_SIZE);
|
||||||
|
|
||||||
/* Initialize system resources list */
|
|
||||||
XtLdrProtocol->LinkedList.InitializeHead(&LoaderBlock->SystemResourcesListHead);
|
XtLdrProtocol->LinkedList.InitializeHead(&LoaderBlock->SystemResourcesListHead);
|
||||||
Status = GetSystemResourcesList(PageMap, PhysicalResources, VirtualResources, FbVirtualAddress, &LoaderBlock->SystemResourcesListHead);
|
GetSystemResourcesList(PageMap, VirtualAddress, &LoaderBlock->SystemResourcesListHead);
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
|
||||||
{
|
|
||||||
/* Failed to initialize system resources list, return status code */
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initialize memory descriptor list */
|
/* Initialize memory descriptor list */
|
||||||
XtLdrProtocol->LinkedList.InitializeHead(&LoaderBlock->MemoryDescriptorListHead);
|
XtLdrProtocol->LinkedList.InitializeHead(&LoaderBlock->MemoryDescriptorListHead);
|
||||||
Status = GetMemoryDescriptorList(PageMap, PhysicalDescriptor, VirtualDescriptor, &LoaderBlock->MemoryDescriptorListHead);
|
GetMemoryDescriptorList(PageMap, VirtualAddress, &LoaderBlock->MemoryDescriptorListHead);
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
|
||||||
{
|
|
||||||
/* Failed to initialize memory descriptor list, return status code */
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set boot image size */
|
/* Set boot image size */
|
||||||
LoaderBlock->BootImageSize = (PFN_NUMBER)(((ULONGLONG)*VirtualAddress - KSEG0_BASE) / EFI_PAGE_SIZE);
|
LoaderBlock->BootImageSize = (PFN_NUMBER)(((ULONGLONG)*VirtualAddress - KSEG0_BASE) / EFI_PAGE_SIZE);
|
||||||
@@ -717,14 +702,6 @@ Xtos::RunBootSequence(IN PEFI_FILE_HANDLE BootDir,
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Build page map */
|
|
||||||
Status = BuildPageMap(&PageMap);
|
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
|
||||||
{
|
|
||||||
XtLdrProtocol->Debug.Print(L"Failed to build page map (Status code: %zX)\n", Status);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Store virtual address of kernel initialization block for future kernel call */
|
/* Store virtual address of kernel initialization block for future kernel call */
|
||||||
KernelParameters = (PKERNEL_INITIALIZATION_BLOCK)VirtualAddress;
|
KernelParameters = (PKERNEL_INITIALIZATION_BLOCK)VirtualAddress;
|
||||||
|
|
||||||
|
|||||||
@@ -1054,7 +1054,6 @@ Protocol::InstallXtLoaderProtocol()
|
|||||||
LoaderProtocol.Memory.AllocatePages = Memory::AllocatePages;
|
LoaderProtocol.Memory.AllocatePages = Memory::AllocatePages;
|
||||||
LoaderProtocol.Memory.AllocatePool = Memory::AllocatePool;
|
LoaderProtocol.Memory.AllocatePool = Memory::AllocatePool;
|
||||||
LoaderProtocol.Memory.BuildPageMap = Memory::BuildPageMap;
|
LoaderProtocol.Memory.BuildPageMap = Memory::BuildPageMap;
|
||||||
LoaderProtocol.Memory.CommitPageMap = Memory::CommitPageMap;
|
|
||||||
LoaderProtocol.Memory.CompareMemory = RTL::Memory::CompareMemory;
|
LoaderProtocol.Memory.CompareMemory = RTL::Memory::CompareMemory;
|
||||||
LoaderProtocol.Memory.CopyMemory = RTL::Memory::CopyMemory;
|
LoaderProtocol.Memory.CopyMemory = RTL::Memory::CopyMemory;
|
||||||
LoaderProtocol.Memory.FreePages = Memory::FreePages;
|
LoaderProtocol.Memory.FreePages = Memory::FreePages;
|
||||||
|
|||||||
@@ -51,7 +51,6 @@ typedef EFI_STATUS (XTCDECL *PBL_BOOTMENU_INITIALIZE_OS_LIST)(IN ULONG MaxNameLe
|
|||||||
typedef BOOLEAN (XTCDECL *PBL_BOOTUTILS_GET_BOOLEAN_PARAMETER)(IN PCWSTR Parameters, IN PCWSTR Needle);
|
typedef BOOLEAN (XTCDECL *PBL_BOOTUTILS_GET_BOOLEAN_PARAMETER)(IN PCWSTR Parameters, IN PCWSTR Needle);
|
||||||
typedef VOID (XTAPI *PBL_BOOTUTILS_GET_TRAMPOLINE_INFORMATION)(IN TRAMPOLINE_TYPE TrampolineType, OUT PVOID *TrampolineCode, OUT PULONG_PTR TrampolineSize);
|
typedef VOID (XTAPI *PBL_BOOTUTILS_GET_TRAMPOLINE_INFORMATION)(IN TRAMPOLINE_TYPE TrampolineType, OUT PVOID *TrampolineCode, OUT PULONG_PTR TrampolineSize);
|
||||||
typedef EFI_STATUS (XTCDECL *PBL_BUILD_PAGE_MAP)(IN PXTBL_PAGE_MAPPING PageMap, IN ULONG_PTR SelfMapAddress);
|
typedef EFI_STATUS (XTCDECL *PBL_BUILD_PAGE_MAP)(IN PXTBL_PAGE_MAPPING PageMap, IN ULONG_PTR SelfMapAddress);
|
||||||
typedef EFI_STATUS (XTCDECL *PBL_COMMIT_PAGE_MAP)(IN PXTBL_PAGE_MAPPING PageMap);
|
|
||||||
typedef EFI_STATUS (XTCDECL *PBL_CLOSE_VOLUME)(IN PEFI_HANDLE VolumeHandle);
|
typedef EFI_STATUS (XTCDECL *PBL_CLOSE_VOLUME)(IN PEFI_HANDLE VolumeHandle);
|
||||||
typedef VOID (XTCDECL *PBL_CLEAR_CONSOLE_LINE)(IN ULONGLONG LineNo);
|
typedef VOID (XTCDECL *PBL_CLEAR_CONSOLE_LINE)(IN ULONGLONG LineNo);
|
||||||
typedef BOOLEAN (XTCDECL *PBL_CPU_CPUID)(IN OUT PCPUID_REGISTERS Registers);
|
typedef BOOLEAN (XTCDECL *PBL_CPU_CPUID)(IN OUT PCPUID_REGISTERS Registers);
|
||||||
@@ -450,7 +449,6 @@ typedef struct _XTBL_LOADER_PROTOCOL
|
|||||||
PBL_ALLOCATE_PAGES AllocatePages;
|
PBL_ALLOCATE_PAGES AllocatePages;
|
||||||
PBL_ALLOCATE_POOL AllocatePool;
|
PBL_ALLOCATE_POOL AllocatePool;
|
||||||
PBL_BUILD_PAGE_MAP BuildPageMap;
|
PBL_BUILD_PAGE_MAP BuildPageMap;
|
||||||
PBL_COMMIT_PAGE_MAP CommitPageMap;
|
|
||||||
PBL_COMPARE_MEMORY CompareMemory;
|
PBL_COMPARE_MEMORY CompareMemory;
|
||||||
PBL_COPY_MEMORY CopyMemory;
|
PBL_COPY_MEMORY CopyMemory;
|
||||||
PBL_FREE_PAGES FreePages;
|
PBL_FREE_PAGES FreePages;
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ namespace KE
|
|||||||
public:
|
public:
|
||||||
STATIC XTAPI VOID HaltSystem(VOID);
|
STATIC XTAPI VOID HaltSystem(VOID);
|
||||||
STATIC XTAPI VOID Panic(IN ULONG Code);
|
STATIC XTAPI VOID Panic(IN ULONG Code);
|
||||||
STATIC XTAPI VOID PanicEx(IN ULONG Code,
|
STATIC XTAPI VOID Panic(IN ULONG Code,
|
||||||
IN ULONG_PTR Parameter1,
|
IN ULONG_PTR Parameter1,
|
||||||
IN ULONG_PTR Parameter2,
|
IN ULONG_PTR Parameter2,
|
||||||
IN ULONG_PTR Parameter3,
|
IN ULONG_PTR Parameter3,
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ XTAPI
|
|||||||
VOID
|
VOID
|
||||||
KE::Crash::Panic(IN ULONG Code)
|
KE::Crash::Panic(IN ULONG Code)
|
||||||
{
|
{
|
||||||
PanicEx(Code, 0, 0, 0, 0);
|
Panic(Code, 0, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -70,7 +70,7 @@ KE::Crash::Panic(IN ULONG Code)
|
|||||||
*/
|
*/
|
||||||
XTAPI
|
XTAPI
|
||||||
VOID
|
VOID
|
||||||
KE::Crash::PanicEx(IN ULONG Code,
|
KE::Crash::Panic(IN ULONG Code,
|
||||||
IN ULONG_PTR Parameter1,
|
IN ULONG_PTR Parameter1,
|
||||||
IN ULONG_PTR Parameter2,
|
IN ULONG_PTR Parameter2,
|
||||||
IN ULONG_PTR Parameter3,
|
IN ULONG_PTR Parameter3,
|
||||||
|
|||||||
@@ -173,7 +173,7 @@ MM::Pfn::DecrementReferenceCount(IN PMMPFN PageFrameNumber,
|
|||||||
if(PageFrameNumber->u2.ShareCount)
|
if(PageFrameNumber->u2.ShareCount)
|
||||||
{
|
{
|
||||||
/* This indicates a bug; crash the system */
|
/* This indicates a bug; crash the system */
|
||||||
KE::Crash::PanicEx(0x4E,
|
KE::Crash::Panic(0x4E,
|
||||||
0x07,
|
0x07,
|
||||||
PageFrameIndex,
|
PageFrameIndex,
|
||||||
PageFrameNumber->u2.ShareCount,
|
PageFrameNumber->u2.ShareCount,
|
||||||
@@ -256,7 +256,7 @@ MM::Pfn::DecrementShareCount(IN PMMPFN PageFrameNumber,
|
|||||||
(PageFrameNumber->u3.e1.PageLocation != StandbyPageList))
|
(PageFrameNumber->u3.e1.PageLocation != StandbyPageList))
|
||||||
{
|
{
|
||||||
/* This indicates a bug; crash the system */
|
/* This indicates a bug; crash the system */
|
||||||
KE::Crash::PanicEx(0x4E,
|
KE::Crash::Panic(0x4E,
|
||||||
0x99,
|
0x99,
|
||||||
PageFrameIndex,
|
PageFrameIndex,
|
||||||
PageFrameNumber->u3.e1.PageLocation,
|
PageFrameNumber->u3.e1.PageLocation,
|
||||||
@@ -591,7 +591,7 @@ MM::Pfn::LinkPage(IN PMMPFNLIST ListHead,
|
|||||||
MM::Paging::GetPteSoftwareTransition(&PageFrame->OriginalPte))
|
MM::Paging::GetPteSoftwareTransition(&PageFrame->OriginalPte))
|
||||||
{
|
{
|
||||||
/* Crash system due to corrupted PFN/PTE state */
|
/* Crash system due to corrupted PFN/PTE state */
|
||||||
KE::Crash::PanicEx(0x71, 0x8888, 0, 0, 0);
|
KE::Crash::Panic(0x71, 0x8888, 0, 0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -806,7 +806,7 @@ MM::Pfn::LinkPfn(IN PFN_NUMBER PageFrameIndex,
|
|||||||
if(Status != STATUS_SUCCESS)
|
if(Status != STATUS_SUCCESS)
|
||||||
{
|
{
|
||||||
/* Could not make the page table resident, crash system */
|
/* Could not make the page table resident, crash system */
|
||||||
KE::Crash::PanicEx(0x1,
|
KE::Crash::Panic(0x1,
|
||||||
(ULONG_PTR)0x61940,
|
(ULONG_PTR)0x61940,
|
||||||
(ULONG_PTR)PointerPte,
|
(ULONG_PTR)PointerPte,
|
||||||
MM::Paging::GetPageFrameNumber(PointerPte),
|
MM::Paging::GetPageFrameNumber(PointerPte),
|
||||||
@@ -1034,7 +1034,7 @@ MM::Pfn::ProcessMemoryDescriptor(IN PFN_NUMBER BasePage,
|
|||||||
IN PFN_NUMBER PageCount,
|
IN PFN_NUMBER PageCount,
|
||||||
IN LOADER_MEMORY_TYPE MemoryType)
|
IN LOADER_MEMORY_TYPE MemoryType)
|
||||||
{
|
{
|
||||||
PVOID VirtualRangeStart, VirtualRangeEnd;
|
PVOID VirtualAddress, VirtualRangeStart, VirtualRangeEnd;
|
||||||
PFN_NUMBER PageNumber;
|
PFN_NUMBER PageNumber;
|
||||||
PMMPDE PointerPde;
|
PMMPDE PointerPde;
|
||||||
PMMPFN Pfn;
|
PMMPFN Pfn;
|
||||||
@@ -1087,8 +1087,12 @@ MM::Pfn::ProcessMemoryDescriptor(IN PFN_NUMBER BasePage,
|
|||||||
/* Ensure that the page is not already in-use */
|
/* Ensure that the page is not already in-use */
|
||||||
if(Pfn->u3.e2.ReferenceCount == 0)
|
if(Pfn->u3.e2.ReferenceCount == 0)
|
||||||
{
|
{
|
||||||
|
/* Calculate the virtual address for this page */
|
||||||
|
VirtualAddress = (PVOID)(KSEG0_BASE + ((BasePage + PageNumber) << MM_PAGE_SHIFT));
|
||||||
|
PointerPde = MM::Paging::GetPdeAddress(VirtualAddress);
|
||||||
|
|
||||||
/* Initialize the PFN entry to represent a ROM page */
|
/* Initialize the PFN entry to represent a ROM page */
|
||||||
Pfn->PteAddress = MM::Paging::GetPteAddress(VirtualRangeStart);
|
Pfn->PteAddress = MM::Paging::GetPteAddress(VirtualAddress);
|
||||||
Pfn->u1.Flink = 0;
|
Pfn->u1.Flink = 0;
|
||||||
Pfn->u2.ShareCount = 0;
|
Pfn->u2.ShareCount = 0;
|
||||||
Pfn->u3.e1.CacheAttribute = PfnCached;
|
Pfn->u3.e1.CacheAttribute = PfnCached;
|
||||||
@@ -1117,8 +1121,12 @@ MM::Pfn::ProcessMemoryDescriptor(IN PFN_NUMBER BasePage,
|
|||||||
/* Ensure that the page is not already in-use */
|
/* Ensure that the page is not already in-use */
|
||||||
if(Pfn->u3.e2.ReferenceCount == 0)
|
if(Pfn->u3.e2.ReferenceCount == 0)
|
||||||
{
|
{
|
||||||
|
/* Calculate the virtual address for this page */
|
||||||
|
VirtualAddress = (PVOID)(KSEG0_BASE + ((BasePage + PageNumber) << MM_PAGE_SHIFT));
|
||||||
|
PointerPde = MM::Paging::GetPdeAddress(VirtualAddress);
|
||||||
|
|
||||||
/* Initialize the PFN entry to represent an in-use page and prevent it from being allocated */
|
/* Initialize the PFN entry to represent an in-use page and prevent it from being allocated */
|
||||||
Pfn->PteAddress = MM::Paging::GetPteAddress(VirtualRangeStart);
|
Pfn->PteAddress = MM::Paging::GetPteAddress(VirtualAddress);
|
||||||
Pfn->u2.ShareCount++;
|
Pfn->u2.ShareCount++;
|
||||||
Pfn->u3.e1.CacheAttribute = PfnCached;
|
Pfn->u3.e1.CacheAttribute = PfnCached;
|
||||||
Pfn->u3.e1.PageLocation = ActiveAndValid;
|
Pfn->u3.e1.PageLocation = ActiveAndValid;
|
||||||
|
|||||||
Reference in New Issue
Block a user