[PATCH v1 1/2] UefiPayloadPkg: Always build MemoryTypeInformation HOB for DXE GCD


Benjamin Doron
 

MemoryType information assists GCD with defragmenting the memory map.
When the DXE core starts, GCD adds memory descriptors for the resource
descriptors HOBs. This allocates heap space which can be reused later
as the bins by memory type. It seems memory allocation prefers low
ranges.

It seems "below 4G" is an artifact of this heap reuse. However, the
memory type information determines the DXE core's
`MinimalMemorySizeNeeded`, determining which system memory descriptor
HOB may be used by DXE. Furthermore, it's important that the memory
type information be correct, for an S4 memory map.

Therefore, follow other bootloaders, such as [MinPlatform][1], and do
this unconditionally. As of [edk2-stable202011][2], it was.

[1]: https://github.com/tianocore/edk2-platforms/blob/b6f96743891be51541184=
bf61dd2970c008e2c43/Platform/Intel/MinPlatformPkg/PlatformInit/PlatformInit=
Pei/PlatformInitPreMem.c#L164-L201
[2]: https://github.com/tianocore/edk2/blob/edk2-stable202011/UefiPayloadPk=
g/BlSupportPei/BlSupportPei.c#L462-L466

Cc: Guo Dong <guo.dong@...>
Cc: Ray Ni <ray.ni@...>
Cc: Sean Rhodes <sean@...>
Cc: James Lu <james.lu@...>
Cc: Gua Guo <gua.guo@...>
Signed-off-by: Benjamin Doron <benjamin.doron00@...>
---
.../UefiPayloadEntry/UefiPayloadEntry.c | 36 +++++--------------
.../UefiPayloadEntry/UefiPayloadEntry.inf | 2 --
UefiPayloadPkg/UefiPayloadPkg.dec | 3 --
UefiPayloadPkg/UefiPayloadPkg.dsc | 2 --
4 files changed, 8 insertions(+), 35 deletions(-)

diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c b/UefiPaylo=
adPkg/UefiPayloadEntry/UefiPayloadEntry.c
index 780348eadfa8..030a5baed914 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c
@@ -19,30 +19,6 @@ EFI_MEMORY_TYPE_INFORMATION mDefaultMemoryTypeInformati=
on[] =3D {
{ EfiMaxMemoryType, 0 =
}=0D
};=0D
=0D
-/**=0D
- Function to reserve memory below 4GB for EDKII Modules.=0D
-=0D
- This causes the DXE to dispatch everything under 4GB and allows Operati=
ng=0D
- System's that require EFI_LOADED_IMAGE to be under 4GB to start.=0D
- e.g. Xen hypervisor used in Qubes.=0D
-**/=0D
-VOID=0D
-ForceModulesBelow4G (=0D
- VOID=0D
- )=0D
-{=0D
- DEBUG ((DEBUG_INFO, "Building hob to restrict memory resorces to below 4=
G.\n"));=0D
-=0D
- //=0D
- // Create Memory Type Information HOB=0D
- //=0D
- BuildGuidDataHob (=0D
- &gEfiMemoryTypeInformationGuid,=0D
- mDefaultMemoryTypeInformation,=0D
- sizeof (mDefaultMemoryTypeInformation)=0D
- );=0D
-}=0D
-=0D
/**=0D
Callback function to build resource descriptor HOB=0D
=0D
@@ -472,10 +448,14 @@ _ModuleEntryPoint (
// Build other HOBs required by DXE=0D
BuildGenericHob ();=0D
=0D
- // Create a HOB to make resources for EDKII modules below 4G=0D
- if (!FixedPcdGetBool (PcdDispatchModuleAbove4GMemory)) {=0D
- ForceModulesBelow4G ();=0D
- }=0D
+ //=0D
+ // Create Memory Type Information HOB=0D
+ //=0D
+ BuildGuidDataHob (=0D
+ &gEfiMemoryTypeInformationGuid,=0D
+ mDefaultMemoryTypeInformation,=0D
+ sizeof (mDefaultMemoryTypeInformation)=0D
+ );=0D
=0D
// Load the DXE Core=0D
Status =3D LoadDxeCore (&DxeCoreEntryPoint);=0D
diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf b/UefiPay=
loadPkg/UefiPayloadEntry/UefiPayloadEntry.inf
index d47e8e76cf4c..e2af8a4b7c1b 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf
+++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf
@@ -96,5 +96,3 @@
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeNxMemoryProtectionPolicy ## SOMETIM=
ES_CONSUMES=0D
gEfiMdeModulePkgTokenSpaceGuid.PcdImageProtectionPolicy ## SOMETIM=
ES_CONSUMES=0D
=0D
- gUefiPayloadPkgTokenSpaceGuid.PcdDispatchModuleAbove4GMemory=0D
-=0D
diff --git a/UefiPayloadPkg/UefiPayloadPkg.dec b/UefiPayloadPkg/UefiPayload=
Pkg.dec
index 7d61d6eeae6c..2ed73513700d 100644
--- a/UefiPayloadPkg/UefiPayloadPkg.dec
+++ b/UefiPayloadPkg/UefiPayloadPkg.dec
@@ -82,9 +82,6 @@ gUefiPayloadPkgTokenSpaceGuid.PcdSystemMemoryUefiRegionSi=
ze|0x04000000|UINT32|0x
=0D
gUefiPayloadPkgTokenSpaceGuid.PcdPcdDriverFile|{ 0x57, 0x72, 0xcf, 0x80, 0=
xab, 0x87, 0xf9, 0x47, 0xa3, 0xfe, 0xD5, 0x0B, 0x76, 0xd8, 0x95, 0x41 }|VOI=
D*|0x00000018=0D
=0D
-# Above 4G Memory=0D
-gUefiPayloadPkgTokenSpaceGuid.PcdDispatchModuleAbove4GMemory|TRUE|BOOLEAN|=
0x00000019=0D
-=0D
# Boot Manager Key=0D
gUefiPayloadPkgTokenSpaceGuid.PcdBootManagerEscape|FALSE|BOOLEAN|0x0000002=
0=0D
=0D
diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayload=
Pkg.dsc
index bca5d3f335bc..9847f189fff5 100644
--- a/UefiPayloadPkg/UefiPayloadPkg.dsc
+++ b/UefiPayloadPkg/UefiPayloadPkg.dsc
@@ -34,7 +34,6 @@
DEFINE SECURITY_STUB_ENABLE =3D TRUE=0D
DEFINE SMM_SUPPORT =3D FALSE=0D
DEFINE PLATFORM_BOOT_TIMEOUT =3D 3=0D
- DEFINE ABOVE_4G_MEMORY =3D TRUE=0D
DEFINE BOOT_MANAGER_ESCAPE =3D FALSE=0D
DEFINE ATA_ENABLE =3D TRUE=0D
DEFINE SD_ENABLE =3D TRUE=0D
@@ -442,7 +441,6 @@
!endif=0D
gEfiMdeModulePkgTokenSpaceGuid.PcdSdMmcGenericTimeoutValue|$(SD_MMC_TIME=
OUT)=0D
=0D
- gUefiPayloadPkgTokenSpaceGuid.PcdDispatchModuleAbove4GMemory|$(ABOVE_4G_=
MEMORY)=0D
gUefiPayloadPkgTokenSpaceGuid.PcdBootManagerEscape|$(BOOT_MANAGER_ESCAPE=
)=0D
=0D
gEfiMdePkgTokenSpaceGuid.PcdMaximumUnicodeStringLength|1800000=0D
--=20
2.39.1


Sean Rhodes
 

Reviewed-by: Sean Rhodes <sean@...>

On Sat, 1 Apr 2023 at 00:58, Benjamin Doron <benjamin.doron00@...> wrote:
MemoryType information assists GCD with defragmenting the memory map.
When the DXE core starts, GCD adds memory descriptors for the resource
descriptors HOBs. This allocates heap space which can be reused later
as the bins by memory type. It seems memory allocation prefers low
ranges.

It seems "below 4G" is an artifact of this heap reuse. However, the
memory type information determines the DXE core's
`MinimalMemorySizeNeeded`, determining which system memory descriptor
HOB may be used by DXE. Furthermore, it's important that the memory
type information be correct, for an S4 memory map.

Therefore, follow other bootloaders, such as [MinPlatform][1], and do
this unconditionally. As of [edk2-stable202011][2], it was.

[1]: https://github.com/tianocore/edk2-platforms/blob/b6f96743891be51541184bf61dd2970c008e2c43/Platform/Intel/MinPlatformPkg/PlatformInit/PlatformInitPei/PlatformInitPreMem.c#L164-L201
[2]: https://github.com/tianocore/edk2/blob/edk2-stable202011/UefiPayloadPkg/BlSupportPei/BlSupportPei.c#L462-L466

Cc: Guo Dong <guo.dong@...>
Cc: Ray Ni <ray.ni@...>
Cc: Sean Rhodes <sean@...>
Cc: James Lu <james.lu@...>
Cc: Gua Guo <gua.guo@...>
Signed-off-by: Benjamin Doron <benjamin.doron00@...>
---
 .../UefiPayloadEntry/UefiPayloadEntry.c       | 36 +++++--------------
 .../UefiPayloadEntry/UefiPayloadEntry.inf     |  2 --
 UefiPayloadPkg/UefiPayloadPkg.dec             |  3 --
 UefiPayloadPkg/UefiPayloadPkg.dsc             |  2 --
 4 files changed, 8 insertions(+), 35 deletions(-)

diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c
index 780348eadfa8..030a5baed914 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c
@@ -19,30 +19,6 @@ EFI_MEMORY_TYPE_INFORMATION  mDefaultMemoryTypeInformation[] = {
   { EfiMaxMemoryType,       0                                                   }
 };

-/**
-   Function to reserve memory below 4GB for EDKII Modules.
-
-   This causes the DXE to dispatch everything under 4GB and allows Operating
-   System's that require EFI_LOADED_IMAGE to be under 4GB to start.
-   e.g. Xen hypervisor used in Qubes.
-**/
-VOID
-ForceModulesBelow4G (
-  VOID
-  )
-{
-  DEBUG ((DEBUG_INFO, "Building hob to restrict memory resorces to below 4G.\n"));
-
-  //
-  // Create Memory Type Information HOB
-  //
-  BuildGuidDataHob (
-    &gEfiMemoryTypeInformationGuid,
-    mDefaultMemoryTypeInformation,
-    sizeof (mDefaultMemoryTypeInformation)
-    );
-}
-
 /**
    Callback function to build resource descriptor HOB

@@ -472,10 +448,14 @@ _ModuleEntryPoint (
   // Build other HOBs required by DXE
   BuildGenericHob ();

-  // Create a HOB to make resources for EDKII modules below 4G
-  if (!FixedPcdGetBool (PcdDispatchModuleAbove4GMemory)) {
-    ForceModulesBelow4G ();
-  }
+  //
+  // Create Memory Type Information HOB
+  //
+  BuildGuidDataHob (
+    &gEfiMemoryTypeInformationGuid,
+    mDefaultMemoryTypeInformation,
+    sizeof (mDefaultMemoryTypeInformation)
+    );

   // Load the DXE Core
   Status = LoadDxeCore (&DxeCoreEntryPoint);
diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf
index d47e8e76cf4c..e2af8a4b7c1b 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf
+++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf
@@ -96,5 +96,3 @@
   gEfiMdeModulePkgTokenSpaceGuid.PcdDxeNxMemoryProtectionPolicy ## SOMETIMES_CONSUMES
   gEfiMdeModulePkgTokenSpaceGuid.PcdImageProtectionPolicy       ## SOMETIMES_CONSUMES

-  gUefiPayloadPkgTokenSpaceGuid.PcdDispatchModuleAbove4GMemory
-
diff --git a/UefiPayloadPkg/UefiPayloadPkg.dec b/UefiPayloadPkg/UefiPayloadPkg.dec
index 7d61d6eeae6c..2ed73513700d 100644
--- a/UefiPayloadPkg/UefiPayloadPkg.dec
+++ b/UefiPayloadPkg/UefiPayloadPkg.dec
@@ -82,9 +82,6 @@ gUefiPayloadPkgTokenSpaceGuid.PcdSystemMemoryUefiRegionSize|0x04000000|UINT32|0x

 gUefiPayloadPkgTokenSpaceGuid.PcdPcdDriverFile|{ 0x57, 0x72, 0xcf, 0x80, 0xab, 0x87, 0xf9, 0x47, 0xa3, 0xfe, 0xD5, 0x0B, 0x76, 0xd8, 0x95, 0x41 }|VOID*|0x00000018

-# Above 4G Memory
-gUefiPayloadPkgTokenSpaceGuid.PcdDispatchModuleAbove4GMemory|TRUE|BOOLEAN|0x00000019
-
 # Boot Manager Key
 gUefiPayloadPkgTokenSpaceGuid.PcdBootManagerEscape|FALSE|BOOLEAN|0x00000020

diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc
index bca5d3f335bc..9847f189fff5 100644
--- a/UefiPayloadPkg/UefiPayloadPkg.dsc
+++ b/UefiPayloadPkg/UefiPayloadPkg.dsc
@@ -34,7 +34,6 @@
   DEFINE SECURITY_STUB_ENABLE         = TRUE
   DEFINE SMM_SUPPORT                  = FALSE
   DEFINE PLATFORM_BOOT_TIMEOUT        = 3
-  DEFINE ABOVE_4G_MEMORY              = TRUE
   DEFINE BOOT_MANAGER_ESCAPE          = FALSE
   DEFINE ATA_ENABLE                   = TRUE
   DEFINE SD_ENABLE                    = TRUE
@@ -442,7 +441,6 @@
 !endif
   gEfiMdeModulePkgTokenSpaceGuid.PcdSdMmcGenericTimeoutValue|$(SD_MMC_TIMEOUT)

-  gUefiPayloadPkgTokenSpaceGuid.PcdDispatchModuleAbove4GMemory|$(ABOVE_4G_MEMORY)
   gUefiPayloadPkgTokenSpaceGuid.PcdBootManagerEscape|$(BOOT_MANAGER_ESCAPE)

   gEfiMdePkgTokenSpaceGuid.PcdMaximumUnicodeStringLength|1800000
--
2.39.1