From: "Gerd Hoffmann" <kraxel@redhat.com>
To: devel@edk2.groups.io
Cc: Oliver Steffen <osteffen@redhat.com>,
Jiewen Yao <jiewen.yao@intel.com>,
Laszlo Ersek <lersek@redhat.com>,
Ard Biesheuvel <ardb+tianocore@kernel.org>,
Gerd Hoffmann <kraxel@redhat.com>
Subject: [edk2-devel] [PATCH 2/3] OvmfPkg/PlatformPei: rewrite page table calculation
Date: Wed, 31 Jan 2024 12:59:59 +0100 [thread overview]
Message-ID: <20240131120000.358090-3-kraxel@redhat.com> (raw)
In-Reply-To: <20240131120000.358090-1-kraxel@redhat.com>
Consider 5-level paging. Simplify calculation to make it easier to
understand. The new calculation is not 100% exact, but we only need
a rough estimate to reserve enough memory.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
OvmfPkg/PlatformPei/MemDetect.c | 42 ++++++++++++++++++---------------
1 file changed, 23 insertions(+), 19 deletions(-)
diff --git a/OvmfPkg/PlatformPei/MemDetect.c b/OvmfPkg/PlatformPei/MemDetect.c
index 338798b54171..e22743b4bfaa 100644
--- a/OvmfPkg/PlatformPei/MemDetect.c
+++ b/OvmfPkg/PlatformPei/MemDetect.c
@@ -184,8 +184,10 @@ GetPeiMemoryCap (
BOOLEAN Page1GSupport;
UINT32 RegEax;
UINT32 RegEdx;
- UINT32 Pml4Entries;
- UINT32 PdpEntries;
+ UINT32 Level5Pages;
+ UINT32 Level4Pages;
+ UINT32 Level3Pages;
+ UINT32 Level2Pages;
UINTN TotalPages;
UINTN ApStacks;
UINTN MemoryCap;
@@ -203,8 +205,7 @@ GetPeiMemoryCap (
//
// Dependent on physical address width, PEI memory allocations can be
// dominated by the page tables built for 64-bit DXE. So we key the cap off
- // of those. The code below is based on CreateIdentityMappingPageTables() in
- // "MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c".
+ // of those.
//
Page1GSupport = FALSE;
if (PcdGetBool (PcdUse1GPageTable)) {
@@ -217,23 +218,26 @@ GetPeiMemoryCap (
}
}
- if (PlatformInfoHob->PhysMemAddressWidth <= 39) {
- Pml4Entries = 1;
- PdpEntries = 1 << (PlatformInfoHob->PhysMemAddressWidth - 30);
- ASSERT (PdpEntries <= 0x200);
- } else {
- if (PlatformInfoHob->PhysMemAddressWidth > 48) {
- Pml4Entries = 0x200;
- } else {
- Pml4Entries = 1 << (PlatformInfoHob->PhysMemAddressWidth - 39);
- }
-
- ASSERT (Pml4Entries <= 0x200);
- PdpEntries = 512;
+ //
+ // This calculation doesn't return the *exact* number of page table
+ // pages needed. But we only need a rough estimate to reserve
+ // enough memory, being off by a few pages isn't much of problem.
+ // So keep the calculation simple and easy to understand.
+ //
+ // Page size is 4k, which needs 12 address bits.
+ // Page tables on all levels have 512 entries, mapping to 9 address bits.
+ // We use large pages (2M or 1G), so level 1 never exists.
+ // Start with level 2, where a page covers 12 + 9 + 9 = 30 address bits.
+ //
+ Level2Pages = (1 << (PlatformInfoHob->PhysMemAddressWidth - 30)) + 1;
+ Level3Pages = (Level2Pages >> 9) + 1;
+ Level4Pages = (Level3Pages >> 9) + 1;
+ Level5Pages = (Level4Pages >> 9) + 1;
+ if (Page1GSupport) {
+ Level2Pages = 0;
}
- TotalPages = Page1GSupport ? Pml4Entries + 1 :
- (PdpEntries + 1) * Pml4Entries + 1;
+ TotalPages = Level5Pages + Level4Pages + Level3Pages + Level2Pages;
ASSERT (TotalPages <= 0x40201);
ApStacks = PlatformInfoHob->PcdCpuMaxLogicalProcessorNumber * PcdGet32 (PcdCpuApStackSize);
--
2.43.0
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#114884): https://edk2.groups.io/g/devel/message/114884
Mute This Topic: https://groups.io/mt/104073300/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-
next prev parent reply other threads:[~2024-01-31 12:00 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-31 11:59 [edk2-devel] [PATCH 0/3] OvmfPkg/PlatformPei: scaleability fixes for GetPeiMemoryCap() Gerd Hoffmann
2024-01-31 11:59 ` [edk2-devel] [PATCH 1/3] OvmfPkg/PlatformPei: consider AP stacks for pei memory cap Gerd Hoffmann
2024-01-31 14:08 ` Laszlo Ersek
2024-01-31 14:55 ` Gerd Hoffmann
2024-01-31 19:29 ` Laszlo Ersek
2024-01-31 11:59 ` Gerd Hoffmann [this message]
2024-01-31 15:13 ` [edk2-devel] [PATCH 2/3] OvmfPkg/PlatformPei: rewrite page table calculation Laszlo Ersek
2024-01-31 15:21 ` Laszlo Ersek
2024-01-31 16:28 ` Gerd Hoffmann
2024-02-01 21:04 ` Laszlo Ersek
2024-01-31 12:00 ` [edk2-devel] [PATCH 3/3] OvmfPkg/PlatformPei: log pei memory cap details Gerd Hoffmann
2024-01-31 15:38 ` 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=20240131120000.358090-3-kraxel@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