[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v3 5/7] OvmfPkg/XenPlatformPei: Map extra physical address


  • To: <devel@xxxxxxxxxxxxxx>
  • From: Anthony PERARD <anthony.perard@xxxxxxxxxx>
  • Date: Mon, 12 Apr 2021 14:30:01 +0100
  • Authentication-results: esa3.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none
  • Cc: Laszlo Ersek <lersek@xxxxxxxxxx>, Jordan Justen <jordan.l.justen@xxxxxxxxx>, Ard Biesheuvel <ardb+tianocore@xxxxxxxxxx>, <xen-devel@xxxxxxxxxxxxxxxxxxxx>, Anthony PERARD <anthony.perard@xxxxxxxxxx>, Julien Grall <julien@xxxxxxx>
  • Delivery-date: Mon, 12 Apr 2021 13:30:32 +0000
  • Ironport-hdrordr: A9a23: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 ftGQc=
  • Ironport-sdr: eD5DP9vxX5LQTSW+pf1qVlZgnbM6gRRuaio//9qwrItnEKV68A8ZcLcvC5boINz5vmXgjTPGOk K3omFMAfS0ziUZuEhUBaYI5Nds6E0r4plhu8pymO6ybsq7z6Rmbtv6BsExDOaXq55lmoRajYbs aATopE26j53ScX3WC6KuNNoC2KNqo1PT+DLUAvWRndQgQuZoWD+Hbe0v+hAgqwHqafe0ciWMqd u/yrYxa9CLsFfAjGZF2AWwUniHtJ4BpnySQQC5J6RXUC12VIYSa5cRqJlgZFhQhcwcbbO+bCJd ++U=
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

Some information available in a Xen guest can be mapped anywhere in
the physical address space and they don't need to be backed by RAM.
For example, the shared info page.

While it's easier to put those pages anywhere, it is better to avoid
mapping it where the RAM is. It might split a nice 1G guest page table
into 4k pages and thus reducing performance of the guest when it
accesses its memory. Also mapping a page like the shared info page and
then unmapping it or mapping it somewhere else would leave a hole in
the RAM that the guest would propably not be able to use anymore.

So the patch introduces a new function which can be used to 1:1
mapping of guest physical memory above 4G during the PEI phase so we
can map the Xen shared pages outside of memory that can be used by
guest, and as high as possible.

Signed-off-by: Anthony PERARD <anthony.perard@xxxxxxxxxx>
Acked-by: Laszlo Ersek <lersek@xxxxxxxxxx>
---

Notes:
    v3:
    - fix typos
    v2:
    - new patch

 OvmfPkg/XenPlatformPei/XenPlatformPei.inf |  1 +
 OvmfPkg/XenPlatformPei/Platform.h         |  5 ++
 OvmfPkg/XenPlatformPei/Xen.c              | 71 +++++++++++++++++++++++
 3 files changed, 77 insertions(+)

diff --git a/OvmfPkg/XenPlatformPei/XenPlatformPei.inf 
b/OvmfPkg/XenPlatformPei/XenPlatformPei.inf
index 0ef77db92c03..8790d907d3ec 100644
--- a/OvmfPkg/XenPlatformPei/XenPlatformPei.inf
+++ b/OvmfPkg/XenPlatformPei/XenPlatformPei.inf
@@ -66,6 +66,7 @@ [Pcd]
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvSize
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfLockBoxStorageBase
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfLockBoxStorageSize
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfHostBridgePciDevId
diff --git a/OvmfPkg/XenPlatformPei/Platform.h 
b/OvmfPkg/XenPlatformPei/Platform.h
index 7661f4a8de0a..e70ca58078eb 100644
--- a/OvmfPkg/XenPlatformPei/Platform.h
+++ b/OvmfPkg/XenPlatformPei/Platform.h
@@ -127,6 +127,11 @@ XenGetE820Map (
   UINT32 *Count
   );
 
+EFI_STATUS
+PhysicalAddressIdentityMapping (
+  IN EFI_PHYSICAL_ADDRESS AddressToMap
+  );
+
 extern EFI_BOOT_MODE mBootMode;
 
 extern UINT8 mPhysMemAddressWidth;
diff --git a/OvmfPkg/XenPlatformPei/Xen.c b/OvmfPkg/XenPlatformPei/Xen.c
index c41fecdc486e..b2a7d1c21dac 100644
--- a/OvmfPkg/XenPlatformPei/Xen.c
+++ b/OvmfPkg/XenPlatformPei/Xen.c
@@ -17,6 +17,8 @@
 //
 // The Library classes this module consumes
 //
+#include <Library/BaseMemoryLib.h>
+#include <Library/CpuLib.h>
 #include <Library/DebugLib.h>
 #include <Library/HobLib.h>
 #include <Library/MemoryAllocationLib.h>
@@ -25,6 +27,7 @@
 #include <IndustryStandard/E820.h>
 #include <Library/ResourcePublicationLib.h>
 #include <Library/MtrrLib.h>
+#include <IndustryStandard/PageTable.h>
 #include <IndustryStandard/Xen/arch-x86/hvm/start_info.h>
 #include <Library/XenHypercallLib.h>
 #include <IndustryStandard/Xen/memory.h>
@@ -386,3 +389,71 @@ InitializeXen (
 
   return EFI_SUCCESS;
 }
+
+EFI_STATUS
+PhysicalAddressIdentityMapping (
+  IN EFI_PHYSICAL_ADDRESS   AddressToMap
+  )
+{
+  INTN                            Index;
+  PAGE_MAP_AND_DIRECTORY_POINTER  *L4, *L3;
+  PAGE_TABLE_ENTRY                *PageTable;
+
+  DEBUG ((DEBUG_INFO, "Mapping 1:1 of address 0x%lx\n", (UINT64)AddressToMap));
+
+  // L4 / Top level Page Directory Pointers
+
+  L4 = (VOID*)(UINTN)PcdGet32 (PcdOvmfSecPageTablesBase);
+  Index = PML4_OFFSET (AddressToMap);
+
+  if (!L4[Index].Bits.Present) {
+    L3 = AllocatePages (1);
+    if (L3 == NULL) {
+      return EFI_OUT_OF_RESOURCES;
+    }
+
+    ZeroMem (L3, EFI_PAGE_SIZE);
+
+    L4[Index].Bits.ReadWrite = 1;
+    L4[Index].Bits.Accessed = 1;
+    L4[Index].Bits.PageTableBaseAddress = (EFI_PHYSICAL_ADDRESS)L3 >> 12;
+    L4[Index].Bits.Present = 1;
+  }
+
+  // L3 / Next level Page Directory Pointers
+
+  L3 = (VOID*)(EFI_PHYSICAL_ADDRESS)(L4[Index].Bits.PageTableBaseAddress << 
12);
+  Index = PDP_OFFSET (AddressToMap);
+
+  if (!L3[Index].Bits.Present) {
+    PageTable = AllocatePages (1);
+    if (PageTable == NULL) {
+      return EFI_OUT_OF_RESOURCES;
+    }
+
+    ZeroMem (PageTable, EFI_PAGE_SIZE);
+
+    L3[Index].Bits.ReadWrite = 1;
+    L3[Index].Bits.Accessed = 1;
+    L3[Index].Bits.PageTableBaseAddress = (EFI_PHYSICAL_ADDRESS)PageTable >> 
12;
+    L3[Index].Bits.Present = 1;
+  }
+
+  // L2 / Page Table Entries
+
+  PageTable = 
(VOID*)(EFI_PHYSICAL_ADDRESS)(L3[Index].Bits.PageTableBaseAddress << 12);
+  Index = PDE_OFFSET (AddressToMap);
+
+  if (!PageTable[Index].Bits.Present) {
+    PageTable[Index].Bits.ReadWrite = 1;
+    PageTable[Index].Bits.Accessed = 1;
+    PageTable[Index].Bits.Dirty = 1;
+    PageTable[Index].Bits.MustBe1 = 1;
+    PageTable[Index].Bits.PageTableBaseAddress = AddressToMap >> 21;
+    PageTable[Index].Bits.Present = 1;
+  }
+
+  CpuFlushTlb ();
+
+  return EFI_SUCCESS;
+}
-- 
Anthony PERARD


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.