//\r
// The Library classes this module consumes\r
//\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/CpuLib.h>\r
#include <Library/DebugLib.h>\r
#include <Library/HobLib.h>\r
#include <Library/MemoryAllocationLib.h>\r
#include <IndustryStandard/E820.h>\r
#include <Library/ResourcePublicationLib.h>\r
#include <Library/MtrrLib.h>\r
+#include <IndustryStandard/PageTable.h>\r
#include <IndustryStandard/Xen/arch-x86/hvm/start_info.h>\r
#include <Library/XenHypercallLib.h>\r
#include <IndustryStandard/Xen/memory.h>\r
\r
return EFI_SUCCESS;\r
}\r
+\r
+EFI_STATUS\r
+PhysicalAddressIdentityMapping (\r
+ IN EFI_PHYSICAL_ADDRESS AddressToMap\r
+ )\r
+{\r
+ INTN Index;\r
+ PAGE_MAP_AND_DIRECTORY_POINTER *L4, *L3;\r
+ PAGE_TABLE_ENTRY *PageTable;\r
+\r
+ DEBUG ((DEBUG_INFO, "Mapping 1:1 of address 0x%lx\n", (UINT64)AddressToMap));\r
+\r
+ // L4 / Top level Page Directory Pointers\r
+\r
+ L4 = (VOID*)(UINTN)PcdGet32 (PcdOvmfSecPageTablesBase);\r
+ Index = PML4_OFFSET (AddressToMap);\r
+\r
+ if (!L4[Index].Bits.Present) {\r
+ L3 = AllocatePages (1);\r
+ if (L3 == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ ZeroMem (L3, EFI_PAGE_SIZE);\r
+\r
+ L4[Index].Bits.ReadWrite = 1;\r
+ L4[Index].Bits.Accessed = 1;\r
+ L4[Index].Bits.PageTableBaseAddress = (EFI_PHYSICAL_ADDRESS)L3 >> 12;\r
+ L4[Index].Bits.Present = 1;\r
+ }\r
+\r
+ // L3 / Next level Page Directory Pointers\r
+\r
+ L3 = (VOID*)(EFI_PHYSICAL_ADDRESS)(L4[Index].Bits.PageTableBaseAddress << 12);\r
+ Index = PDP_OFFSET (AddressToMap);\r
+\r
+ if (!L3[Index].Bits.Present) {\r
+ PageTable = AllocatePages (1);\r
+ if (PageTable == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ ZeroMem (PageTable, EFI_PAGE_SIZE);\r
+\r
+ L3[Index].Bits.ReadWrite = 1;\r
+ L3[Index].Bits.Accessed = 1;\r
+ L3[Index].Bits.PageTableBaseAddress = (EFI_PHYSICAL_ADDRESS)PageTable >> 12;\r
+ L3[Index].Bits.Present = 1;\r
+ }\r
+\r
+ // L2 / Page Table Entries\r
+\r
+ PageTable = (VOID*)(EFI_PHYSICAL_ADDRESS)(L3[Index].Bits.PageTableBaseAddress << 12);\r
+ Index = PDE_OFFSET (AddressToMap);\r
+\r
+ if (!PageTable[Index].Bits.Present) {\r
+ PageTable[Index].Bits.ReadWrite = 1;\r
+ PageTable[Index].Bits.Accessed = 1;\r
+ PageTable[Index].Bits.Dirty = 1;\r
+ PageTable[Index].Bits.MustBe1 = 1;\r
+ PageTable[Index].Bits.PageTableBaseAddress = AddressToMap >> 21;\r
+ PageTable[Index].Bits.Present = 1;\r
+ }\r
+\r
+ CpuFlushTlb ();\r
+\r
+ return EFI_SUCCESS;\r
+}\r