This patch enables S3Resume2Pei to eliminate an could be invalid during S3
Resume.

The concrete implementation allocates memory from the HOB heap:

S3ResumeExecuteBootScript() [UefiCpuPkg/.../S3Resume2Pei/S3Resume.c]
  AllocatePool() [MdePkg/Library/PeiMemoryAllocationLib]
    PeiServicesAllocatePool() [MdePkg/Library/PeiServicesLib]
      PeiAllocatePool() [MdeModulePkg/Core/Pei/Memory/MemoryServices.c]
        PeiServicesCreateHob(EFI_HOB_TYPE_MEMORY_POOL)

but we might already be past the migration from temporary RAM to permanent
RAM. In that case the new allocation will fall outside of the permanent
RAM area that may have been reserved from the OS, for example as ACPI NVS
memory.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <ler...@redhat.com>
---
 UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume2Pei.inf | 1 +
 UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume.c       | 5 ++++-
 UefiCpuPkg/UefiCpuPkg.dec                               | 7 +++++++
 3 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume2Pei.inf 
b/UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume2Pei.inf
index db5d66e..85d6d3d 100644
--- a/UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume2Pei.inf
+++ b/UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume2Pei.inf
@@ -85,6 +85,7 @@
 
 [Pcd]
   gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable
+  gUefiCpuPkgTokenSpaceGuid.PcdPeiS3ResumeState
 
 [Depex]
   TRUE
diff --git a/UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume.c 
b/UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume.c
index 426eef7..c5a3b66 100644
--- a/UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume.c
+++ b/UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume.c
@@ -851,7 +851,10 @@ S3ResumeExecuteBootScript (
   //
   // Prepare data for return back
   //
-  PeiS3ResumeState = AllocatePool (sizeof(*PeiS3ResumeState));
+  PeiS3ResumeState = (VOID *)(UINTN)PcdGet64 (PcdPeiS3ResumeState);
+  if (PeiS3ResumeState == NULL) {
+    PeiS3ResumeState = AllocatePool (sizeof(*PeiS3ResumeState));
+  }
   ASSERT (PeiS3ResumeState != NULL);
   DEBUG (( EFI_D_ERROR, "PeiS3ResumeState - %x\r\n", PeiS3ResumeState));
   PeiS3ResumeState->ReturnCs           = 0x10;
diff --git a/UefiCpuPkg/UefiCpuPkg.dec b/UefiCpuPkg/UefiCpuPkg.dec
index b3858b1..d962ef6 100644
--- a/UefiCpuPkg/UefiCpuPkg.dec
+++ b/UefiCpuPkg/UefiCpuPkg.dec
@@ -44,3 +44,10 @@
 [PcdsFixedAtBuild, PcdsPatchableInModule]
   
gUefiCpuPkgTokenSpaceGuid.PcdCpuLocalApicBaseAddress|0xfee00000|UINT32|0x00000001
 
+[PcdsDynamic, PcdsDynamicEx]
+  ## The following PCD controls the allocation of "PeiS3ResumeState" in
+  #  S3ResumeExecuteBootScript()
+  #  [UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume.c]. When left at NULL,
+  #  "PeiS3ResumeState" will be allocated with AllocatePool(). Otherwise the
+  #  address specified in the PCD will be assigned to "PeiS3ResumeState".
+  gUefiCpuPkgTokenSpaceGuid.PcdPeiS3ResumeState|0x0|UINT64|0x00000002
-- 
1.8.3.1



------------------------------------------------------------------------------
Sponsored by Intel(R) XDK 
Develop, test and display web and hybrid apps with a single code base.
Download it for free now!
http://pubads.g.doubleclick.net/gampad/clk?id=111408631&iu=/4140/ostg.clktrk
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to