xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Laszlo Ersek <lersek@redhat.com>
To: devel@edk2.groups.io, anthony.perard@citrix.com
Cc: xen-devel@lists.xenproject.org,
	Jordan Justen <jordan.l.justen@intel.com>,
	Ard Biesheuvel <ard.biesheuvel@linaro.org>,
	Julien Grall <julien@xen.org>
Subject: Re: [edk2-devel] [PATCH v2 5/7] OvmfPkg/XenPlatformPei: Map extra physical address
Date: Wed, 7 Apr 2021 10:06:55 +0200	[thread overview]
Message-ID: <9942168e-a882-67d2-a0d5-00b511d55aad@redhat.com> (raw)
In-Reply-To: <20210325154713.670104-6-anthony.perard@citrix.com>

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@citrix.com>
> ---
> 
> Notes:
>     v2:
>     - new patch

With the typo fixes:

Acked-by: Laszlo Ersek <lersek@redhat.com>

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;
> +}
> 



  reply	other threads:[~2021-04-07  8:07 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-25 15:47 [PATCH v2 0/7] OvmfXen: Set PcdFSBClock at runtime Anthony PERARD
2021-03-25 15:47 ` [PATCH v2 1/7] OvmfPkg/XenResetVector: Silent a warning from nasm Anthony PERARD
2021-03-25 15:47 ` [PATCH v2 2/7] MdePkg: Allow PcdFSBClock to by Dynamic Anthony PERARD
2021-03-25 15:47 ` [PATCH v2 3/7] OvmfPkg/IndustryStandard/Xen: Apply EDK2 coding style to XEN_VCPU_TIME_INFO Anthony PERARD
2021-03-25 15:47 ` [PATCH v2 4/7] OvmfPkg/IndustryStandard: Introduce PageTable.h Anthony PERARD
2021-03-26 14:16   ` Tom Lendacky
2021-04-07  8:01     ` [edk2-devel] " Laszlo Ersek
2021-04-07  8:02   ` Laszlo Ersek
2021-04-07  8:04   ` Laszlo Ersek
2021-03-25 15:47 ` [PATCH v2 5/7] OvmfPkg/XenPlatformPei: Map extra physical address Anthony PERARD
2021-04-07  8:06   ` Laszlo Ersek [this message]
2021-03-25 15:47 ` [PATCH v2 6/7] OvmfPkg/XenPlatformPei: Calibrate APIC timer frequency Anthony PERARD
2021-04-07  8:28   ` [edk2-devel] " Laszlo Ersek
2021-03-25 15:47 ` [PATCH v2 7/7] OvmfPkg/OvmfXen: Set PcdFSBClock Anthony PERARD
2021-04-07  9:25   ` [edk2-devel] " Laszlo Ersek
2021-03-25 18:22 ` [PATCH v2 0/7] OvmfXen: Set PcdFSBClock at runtime Laszlo Ersek
2021-04-07  9:32 ` [edk2-devel] " Laszlo Ersek

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=9942168e-a882-67d2-a0d5-00b511d55aad@redhat.com \
    --to=lersek@redhat.com \
    --cc=anthony.perard@citrix.com \
    --cc=ard.biesheuvel@linaro.org \
    --cc=devel@edk2.groups.io \
    --cc=jordan.l.justen@intel.com \
    --cc=julien@xen.org \
    --cc=xen-devel@lists.xenproject.org \
    --subject='Re: [edk2-devel] [PATCH v2 5/7] OvmfPkg/XenPlatformPei: Map extra physical address' \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).