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;
> +}
>
next prev parent reply other threads:[~2021-04-07 8:07 UTC|newest]
Thread overview: 20+ 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
2022-07-07 4:12 ` [edk2-devel] " ray_linn
2022-07-08 2:14 ` 回复: " gaoliming
2022-07-08 10:33 ` 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 ` Lendacky, Thomas
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-list 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=devel@edk2.groups.io \
/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
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox