[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [edk2-devel] [PATCH v2 5/7] OvmfPkg/XenPlatformPei: Map extra physical address
On 03/25/21 16:47, Anthony PERARD via groups.io wrote: > 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 > access its memory. Also mapping a page like the shared info page and s/access/accesses/ > then unmapping it or mapping it somewhere else would live a hole in s/live/leave/ > the RAM that the guest would propably not been able to use anymore. s/been/be/ > > So the patch introduce a new function which can be used to 1:1 s/introduce/introduces/ > 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> > --- > > Notes: > v2: > - new patch With the typo fixes: Acked-by: Laszlo Ersek <lersek@xxxxxxxxxx> Thanks Laszlo > > 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; > +} >
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |