Xen-Devel Archive on lore.kernel.org
 help / color / Atom feed
From: Laszlo Ersek <lersek@redhat.com>
To: devel@edk2.groups.io, anthony.perard@citrix.com
Cc: Jordan Justen <jordan.l.justen@intel.com>,
	Julien Grall <julien.grall@arm.com>,
	Ard Biesheuvel <ard.biesheuvel@linaro.org>,
	xen-devel@lists.xenproject.org
Subject: Re: [Xen-devel] [edk2-devel] [PATCH v5 23/35] OvmfPkg/XenPlatformPei: Rework memory detection
Date: Thu, 15 Aug 2019 11:26:54 +0200
Message-ID: <ebb5fc74-219f-99f2-62ea-268a6ced2935@redhat.com> (raw)
In-Reply-To: <20190813113119.14804-24-anthony.perard@citrix.com>

On 08/13/19 13:31, Anthony PERARD wrote:
> When running as a Xen PVH guest, there is no CMOS to read the memory
> size from.  Rework GetSystemMemorySize(Below|Above)4gb() so they can
> work without CMOS by reading the e820 table.
> 
> Rework XenPublishRamRegions to also care for the reserved and ACPI
> entry in the e820 table. The region that was added by InitializeXen()
> isn't needed as that same entry is in the e820 table provided by
> hvmloader.
> 
> MTRR settings aren't modified anymore, on HVM it's already done by
> hvmloader, on PVH it is supposed to have sane default. MTRR will need
> to be done properly but keeping what's already been done by programs
> that have run before OVMF will do for now.
> 
> Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=1689
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> Acked-by: Laszlo Ersek <lersek@redhat.com>
> ---
> 
> Notes:
>     v5:
>     - fix coding style
>     - fix typo in commit message
>     - Handle all possible cases of a E820 reserved range overlapping with the
>       LAPIC range.
>     
>     v4:
>     - some coding style
>     - Added AddReservedMemoryRangeHob, and using it.
>     - this patch now replace "OvmfPkg/XenPlatformPei: Reserve hvmloader's memory only when it has run"
>       from v3.  hvmloader have added an entry in the e820 table, there is no
>       need for a special case.
>     - now, everything that is in the e820 table is added to OVMF's memory
>       map, no more skipping ACPI entries or hvmloader's reserved entries.
>       Instead, we look for the local APIC region and avoid it if it is
>       present in the e820.
>     - rework commit message
> 
>  OvmfPkg/XenPlatformPei/Platform.h  | 13 ++++++
>  OvmfPkg/XenPlatformPei/MemDetect.c | 69 +++++++++++++++++++++++++++
>  OvmfPkg/XenPlatformPei/Platform.c  | 11 +++++
>  OvmfPkg/XenPlatformPei/Xen.c       | 75 +++++++++++++++++++++---------
>  4 files changed, 147 insertions(+), 21 deletions(-)
> 
> diff --git a/OvmfPkg/XenPlatformPei/Platform.h b/OvmfPkg/XenPlatformPei/Platform.h
> index db9a62572f..7661f4a8de 100644
> --- a/OvmfPkg/XenPlatformPei/Platform.h
> +++ b/OvmfPkg/XenPlatformPei/Platform.h
> @@ -44,6 +44,13 @@ AddReservedMemoryBaseSizeHob (
>    BOOLEAN                     Cacheable
>    );
>  
> +VOID
> +AddReservedMemoryRangeHob (
> +  EFI_PHYSICAL_ADDRESS        MemoryBase,
> +  EFI_PHYSICAL_ADDRESS        MemoryLimit,
> +  BOOLEAN                     Cacheable
> +  );
> +
>  VOID
>  AddressWidthInitialization (
>    VOID
> @@ -114,6 +121,12 @@ XenPublishRamRegions (
>    VOID
>    );
>  
> +EFI_STATUS
> +XenGetE820Map (
> +  EFI_E820_ENTRY64 **Entries,
> +  UINT32 *Count
> +  );
> +
>  extern EFI_BOOT_MODE mBootMode;
>  
>  extern UINT8 mPhysMemAddressWidth;
> diff --git a/OvmfPkg/XenPlatformPei/MemDetect.c b/OvmfPkg/XenPlatformPei/MemDetect.c
> index cf95f9c474..1f81eee407 100644
> --- a/OvmfPkg/XenPlatformPei/MemDetect.c
> +++ b/OvmfPkg/XenPlatformPei/MemDetect.c
> @@ -96,6 +96,45 @@ Q35TsegMbytesInitialization (
>    mQ35TsegMbytes = ExtendedTsegMbytes;
>  }
>  
> +STATIC
> +UINT64
> +GetHighestSystemMemoryAddress (
> +  BOOLEAN       Below4gb
> +  )
> +{
> +  EFI_E820_ENTRY64    *E820Map;
> +  UINT32              E820EntriesCount;
> +  EFI_E820_ENTRY64    *Entry;
> +  EFI_STATUS          Status;
> +  UINT32              Loop;
> +  UINT64              HighestAddress;
> +  UINT64              EntryEnd;
> +
> +  HighestAddress = 0;
> +
> +  Status = XenGetE820Map (&E820Map, &E820EntriesCount);
> +  ASSERT_EFI_ERROR (Status);
> +
> +  for (Loop = 0; Loop < E820EntriesCount; Loop++) {
> +    Entry = E820Map + Loop;
> +    EntryEnd = Entry->BaseAddr + Entry->Length;
> +
> +    if (Entry->Type == EfiAcpiAddressRangeMemory &&
> +        EntryEnd > HighestAddress) {
> +
> +      if (Below4gb && (EntryEnd <= BASE_4GB)) {
> +        HighestAddress = EntryEnd;
> +      } else if (!Below4gb && (EntryEnd >= BASE_4GB)) {
> +        HighestAddress = EntryEnd;
> +      }
> +    }
> +  }
> +
> +  //
> +  // Round down the end address.
> +  //
> +  return HighestAddress & ~(UINT64)EFI_PAGE_MASK;
> +}
>  
>  UINT32
>  GetSystemMemorySizeBelow4gb (
> @@ -105,6 +144,19 @@ GetSystemMemorySizeBelow4gb (
>    UINT8 Cmos0x34;
>    UINT8 Cmos0x35;
>  
> +  //
> +  // In PVH case, there is no CMOS, we have to calculate the memory size
> +  // from parsing the E820
> +  //
> +  if (XenPvhDetected ()) {
> +    UINT64  HighestAddress;
> +
> +    HighestAddress = GetHighestSystemMemoryAddress (TRUE);
> +    ASSERT (HighestAddress > 0 && HighestAddress <= BASE_4GB);
> +
> +    return HighestAddress;
> +  }
> +
>    //
>    // CMOS 0x34/0x35 specifies the system memory above 16 MB.
>    // * CMOS(0x35) is the high byte
> @@ -129,6 +181,23 @@ GetSystemMemorySizeAbove4gb (
>    UINT32 Size;
>    UINTN  CmosIndex;
>  
> +  //
> +  // In PVH case, there is no CMOS, we have to calculate the memory size
> +  // from parsing the E820
> +  //
> +  if (XenPvhDetected ()) {
> +    UINT64  HighestAddress;
> +
> +    HighestAddress = GetHighestSystemMemoryAddress (FALSE);
> +    ASSERT (HighestAddress == 0 || HighestAddress >= BASE_4GB);
> +
> +    if (HighestAddress >= BASE_4GB) {
> +      HighestAddress -= BASE_4GB;
> +    }
> +
> +    return HighestAddress;
> +  }
> +
>    //
>    // CMOS 0x5b-0x5d specifies the system memory above 4GB MB.
>    // * CMOS(0x5d) is the most significant size byte
> diff --git a/OvmfPkg/XenPlatformPei/Platform.c b/OvmfPkg/XenPlatformPei/Platform.c
> index 6aaafc3ee9..2f42ca6ccd 100644
> --- a/OvmfPkg/XenPlatformPei/Platform.c
> +++ b/OvmfPkg/XenPlatformPei/Platform.c
> @@ -102,6 +102,17 @@ AddReservedMemoryBaseSizeHob (
>      );
>  }
>  
> +VOID
> +AddReservedMemoryRangeHob (
> +  EFI_PHYSICAL_ADDRESS        MemoryBase,
> +  EFI_PHYSICAL_ADDRESS        MemoryLimit,
> +  BOOLEAN                     Cacheable
> +  )
> +{
> +  AddReservedMemoryBaseSizeHob (MemoryBase,
> +    (UINT64)(MemoryLimit - MemoryBase), Cacheable);
> +}
> +
>  VOID
>  AddIoMemoryRangeHob (
>    EFI_PHYSICAL_ADDRESS        MemoryBase,
> diff --git a/OvmfPkg/XenPlatformPei/Xen.c b/OvmfPkg/XenPlatformPei/Xen.c
> index 72f6f37b46..c4506def9a 100644
> --- a/OvmfPkg/XenPlatformPei/Xen.c
> +++ b/OvmfPkg/XenPlatformPei/Xen.c
> @@ -276,9 +276,14 @@ XenPublishRamRegions (
>    VOID
>    )
>  {
> -  EFI_E820_ENTRY64  *E820Map;
> -  UINT32            E820EntriesCount;
> -  EFI_STATUS        Status;
> +  EFI_E820_ENTRY64      *E820Map;
> +  UINT32                E820EntriesCount;
> +  EFI_STATUS            Status;
> +  EFI_E820_ENTRY64      *Entry;
> +  UINTN                 Index;
> +  UINT64                LapicBase;
> +  UINT64                LapicEnd;
> +
>  

The extra newline is not really justified, but it's also harmless and not too annoying.

Otherwise, the update looks good to me, addressing:

* http://mid.mail-archive.com/7b8cb5ef-2163-9e22-350f-877be6951b34@redhat.com
  https://edk2.groups.io/g/devel/message/44615

* http://mid.mail-archive.com/20190807152852.e47kogsxubbjkue5@Air-de-Roger
  https://edk2.groups.io/g/devel/message/45012

So my ACK stands.

Thanks
Laszlo

>    DEBUG ((DEBUG_INFO, "Using memory map provided by Xen\n"));
>  
> @@ -287,26 +292,60 @@ XenPublishRamRegions (
>    //
>    E820EntriesCount = 0;
>    Status = XenGetE820Map (&E820Map, &E820EntriesCount);
> -
>    ASSERT_EFI_ERROR (Status);
>  
> -  if (E820EntriesCount > 0) {
> -    EFI_E820_ENTRY64 *Entry;
> -    UINT32 Loop;
> +  LapicBase = PcdGet32 (PcdCpuLocalApicBaseAddress);
> +  LapicEnd = LapicBase + SIZE_1MB;
> +  AddIoMemoryRangeHob (LapicBase, LapicEnd);
>  
> -    for (Loop = 0; Loop < E820EntriesCount; Loop++) {
> -      Entry = E820Map + Loop;
> +  for (Index = 0; Index < E820EntriesCount; Index++) {
> +    UINT64 Base;
> +    UINT64 End;
> +    UINT64 ReservedBase;
> +    UINT64 ReservedEnd;
>  
> +    Entry = &E820Map[Index];
> +
> +    //
> +    // Round up the start address, and round down the end address.
> +    //
> +    Base = ALIGN_VALUE (Entry->BaseAddr, (UINT64)EFI_PAGE_SIZE);
> +    End = (Entry->BaseAddr + Entry->Length) & ~(UINT64)EFI_PAGE_MASK;
> +
> +    switch (Entry->Type) {
> +    case EfiAcpiAddressRangeMemory:
> +      AddMemoryRangeHob (Base, End);
> +      break;
> +    case EfiAcpiAddressRangeACPI:
> +      AddReservedMemoryRangeHob (Base, End, FALSE);
> +      break;
> +    case EfiAcpiAddressRangeReserved:
>        //
> -      // Only care about RAM
> +      // hvmloader marks a range that overlaps with the local APIC memory
> +      // mapped region as reserved, but CpuDxe wants it as mapped IO. We
> +      // have already added it as mapped IO, so skip it here.
>        //
> -      if (Entry->Type != EfiAcpiAddressRangeMemory) {
> -        continue;
> -      }
>  
> -      AddMemoryBaseSizeHob (Entry->BaseAddr, Entry->Length);
> +      //
> +      // add LAPIC predecessor range, if any
> +      //
> +      ReservedBase = Base;
> +      ReservedEnd = MIN (End, LapicBase);
> +      if (ReservedBase < ReservedEnd) {
> +        AddReservedMemoryRangeHob (ReservedBase, ReservedEnd, FALSE);
> +      }
>  
> -      MtrrSetMemoryAttribute (Entry->BaseAddr, Entry->Length, CacheWriteBack);
> +      //
> +      // add LAPIC successor range, if any
> +      //
> +      ReservedBase = MAX (Base, LapicEnd);
> +      ReservedEnd = End;
> +      if (ReservedBase < ReservedEnd) {
> +        AddReservedMemoryRangeHob (ReservedBase, ReservedEnd, FALSE);
> +      }
> +      break;
> +    default:
> +      break;
>      }
>    }
>  }
> @@ -326,12 +365,6 @@ InitializeXen (
>  {
>    RETURN_STATUS PcdStatus;
>  
> -  //
> -  // Reserve away HVMLOADER reserved memory [0xFC000000,0xFD000000).
> -  // This needs to match HVMLOADER RESERVED_MEMBASE/RESERVED_MEMSIZE.
> -  //
> -  AddReservedMemoryBaseSizeHob (0xFC000000, 0x1000000, FALSE);
> -
>    PcdStatus = PcdSetBoolS (PcdPciDisableBusEnumeration, TRUE);
>    ASSERT_RETURN_ERROR (PcdStatus);
>  
> 


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

  reply index

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-08-13 11:30 [Xen-devel] [PATCH v5 00/35] Specific platform to run OVMF in Xen PVH and HVM guests Anthony PERARD
2019-08-13 11:30 ` [Xen-devel] [PATCH v5 01/35] OvmfPkg/ResetSystemLib: Add missing dependency on PciLib Anthony PERARD
2019-08-13 11:30 ` [Xen-devel] [PATCH v5 02/35] OvmfPkg: Create platform OvmfXen Anthony PERARD
2019-08-13 11:30 ` [Xen-devel] [PATCH v5 03/35] OvmfPkg: Introduce XenResetVector Anthony PERARD
2019-08-13 11:30 ` [Xen-devel] [PATCH v5 04/35] OvmfPkg: Introduce XenPlatformPei Anthony PERARD
2019-08-13 11:30 ` [Xen-devel] [PATCH v5 05/35] OvmfPkg/OvmfXen: Creating an ELF header Anthony PERARD
2019-08-13 11:30 ` [Xen-devel] [PATCH v5 06/35] OvmfPkg/XenResetVector: Add new entry point for Xen PVH Anthony PERARD
2019-08-13 11:30 ` [Xen-devel] [PATCH v5 07/35] OvmfPkg/XenResetVector: Saving start of day pointer for PVH guests Anthony PERARD
2019-08-13 11:30 ` [Xen-devel] [PATCH v5 08/35] OvmfPkg/XenResetVector: Allow jumpstart from either hvmloader or PVH Anthony PERARD
2019-08-21 16:31   ` [Xen-devel] [edk2-devel] " Laszlo Ersek
2019-08-13 11:30 ` [Xen-devel] [PATCH v5 09/35] OvmfPkg/OvmfXen: use a TimerLib instance that depends only on the CPU Anthony PERARD
2019-08-13 11:30 ` [Xen-devel] [PATCH v5 10/35] OvmfPkg/XenPlatformPei: Detect OVMF_INFO from hvmloader Anthony PERARD
2019-08-13 11:30 ` [Xen-devel] [PATCH v5 11/35] OvmfPkg/XenPlatformPei: Use mXenHvmloaderInfo to get E820 Anthony PERARD
2019-08-13 11:30 ` [Xen-devel] [PATCH v5 12/35] OvmfPkg/XenPlatformPei: Grab RSDP from PVH guest start of day struct Anthony PERARD
2019-08-13 11:30 ` [Xen-devel] [PATCH v5 13/35] OvmfPkg/Library/XenPlatformLib: New library Anthony PERARD
2019-08-13 11:30 ` [Xen-devel] [PATCH v5 14/35] OvmfPkg/AcpiPlatformDxe: Use XenPlatformLib Anthony PERARD
2019-08-13 11:30 ` [Xen-devel] [PATCH v5 15/35] OvmfPkg/AcpiPlatformDxe: Use Xen PVH RSDP if it exist Anthony PERARD
2019-08-13 11:31 ` [Xen-devel] [PATCH v5 16/35] OvmfPkg/XenHypercallLib: Enable it in PEIM Anthony PERARD
2019-08-13 11:31 ` [Xen-devel] [PATCH v5 17/35] OvmfPkg/XenPlatformPei: Reinit XenHypercallLib Anthony PERARD
2019-08-13 11:31 ` [Xen-devel] [PATCH v5 18/35] OvmfPkg/XenPlatformPei: Introduce XenHvmloaderDetected Anthony PERARD
2019-08-13 11:31 ` [Xen-devel] [PATCH v5 19/35] OvmfPkg/XenPlatformPei: Setup HyperPages earlier Anthony PERARD
2019-08-13 11:31 ` [Xen-devel] [PATCH v5 20/35] OvmfPkg/XenPlatformPei: Introduce XenPvhDetected Anthony PERARD
2019-08-15  8:54   ` [Xen-devel] [edk2-devel] " Laszlo Ersek
2019-08-13 11:31 ` [Xen-devel] [PATCH v5 21/35] OvmfPkg: Import XENMEM_memory_map hypercall to Xen/memory.h Anthony PERARD
2019-08-13 11:31 ` [Xen-devel] [PATCH v5 22/35] OvmfPkg/XenPlatformPei: no hvmloader: get the E820 table via hypercall Anthony PERARD
2019-08-15  8:59   ` [Xen-devel] [edk2-devel] " Laszlo Ersek
2019-08-13 11:31 ` [Xen-devel] [PATCH v5 23/35] OvmfPkg/XenPlatformPei: Rework memory detection Anthony PERARD
2019-08-15  9:26   ` Laszlo Ersek [this message]
2019-08-13 11:31 ` [Xen-devel] [PATCH v5 24/35] OvmfPkg/XenPlatformPei: Reserve VGA memory region, to boot Linux Anthony PERARD
2019-08-13 11:31 ` [Xen-devel] [PATCH v5 25/35] OvmfPkg/XenPlatformPei: Ignore missing PCI Host Bridge on Xen PVH Anthony PERARD
2019-08-13 11:31 ` [Xen-devel] [PATCH v5 26/35] OvmfPkg/XenPlatformLib: Cache result for XenDetected Anthony PERARD
2019-08-13 11:31 ` [Xen-devel] [PATCH v5 27/35] OvmfPkg/PlatformBootManagerLib: Use XenDetected from XenPlatformLib Anthony PERARD
2019-08-13 11:31 ` [Xen-devel] [PATCH v5 28/35] OvmfPkg/PlatformBootManagerLib: Handle the absence of PCI bus on Xen PVH Anthony PERARD
2019-08-13 11:31 ` [Xen-devel] [PATCH v5 29/35] OvmfPkg/OvmfXen: Override PcdFSBClock to Xen vLAPIC timer frequency Anthony PERARD
2019-08-13 11:31 ` [Xen-devel] [PATCH v5 30/35] OvmfPkg/OvmfXen: Introduce XenTimerDxe Anthony PERARD
2019-08-13 11:31 ` [Xen-devel] [PATCH v5 31/35] OvmfPkg/PlatformBootManagerLib: Use a Xen console for ConOut/ConIn Anthony PERARD
2019-08-15  9:35   ` [Xen-devel] [edk2-devel] " Laszlo Ersek
2019-08-13 11:31 ` [Xen-devel] [PATCH v5 32/35] OvmfPkg: Introduce PcdXenGrantFrames Anthony PERARD
2019-08-15  9:40   ` [Xen-devel] [edk2-devel] " Laszlo Ersek
2019-08-15  9:45     ` Laszlo Ersek
2019-08-13 11:31 ` [Xen-devel] [PATCH v5 33/35] OvmfPkg: Introduce XenIoPvhDxe to initialize Grant Tables Anthony PERARD
2019-08-15  9:42   ` [Xen-devel] [edk2-devel] " Laszlo Ersek
2019-08-13 11:31 ` [Xen-devel] [PATCH v5 34/35] OvmfPkg: Move XenRealTimeClockLib from ArmVirtPkg Anthony PERARD
2019-08-13 11:31 ` [Xen-devel] [PATCH v5 35/35] OvmfPkg/OvmfXen: use RealTimeClockRuntimeDxe from EmbeddedPkg Anthony PERARD
2019-08-15 11:03 ` [Xen-devel] [edk2-devel] [PATCH v5 00/35] Specific platform to run OVMF in Xen PVH and HVM guests Laszlo Ersek
2019-08-21 16:16   ` Laszlo Ersek

Reply instructions:

You may reply publically 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=ebb5fc74-219f-99f2-62ea-268a6ced2935@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.grall@arm.com \
    --cc=xen-devel@lists.xenproject.org \
    /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

Xen-Devel Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/xen-devel/0 xen-devel/git/0.git
	git clone --mirror https://lore.kernel.org/xen-devel/1 xen-devel/git/1.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 xen-devel xen-devel/ https://lore.kernel.org/xen-devel \
		xen-devel@lists.xenproject.org xen-devel@lists.xen.org
	public-inbox-index xen-devel

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.xenproject.lists.xen-devel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git