]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/Sec/SecMain.c
OvmfPkg: Apply uncrustify changes
[mirror_edk2.git] / OvmfPkg / Sec / SecMain.c
index 384fa747355082564746a1bfade0a5b978e0aac0..6d81d5b629880051ca66b119434914ad07eeeb8a 100644 (file)
@@ -3,14 +3,9 @@
 \r
   Copyright (c) 2008 - 2015, Intel Corporation. All rights reserved.<BR>\r
   (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>\r
+  Copyright (c) 2020, Advanced Micro Devices, Inc. All rights reserved.<BR>\r
 \r
-  This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
 #include <Library/PeCoffExtraActionLib.h>\r
 #include <Library/ExtractGuidedSectionLib.h>\r
 #include <Library/LocalApicLib.h>\r
+#include <Library/CpuExceptionHandlerLib.h>\r
+#include <Library/MemEncryptSevLib.h>\r
+#include <Register/Amd/Ghcb.h>\r
+#include <Register/Amd/Msr.h>\r
 \r
 #include <Ppi/TemporaryRamSupport.h>\r
 \r
 #define SEC_IDT_ENTRY_COUNT  34\r
 \r
 typedef struct _SEC_IDT_TABLE {\r
-  EFI_PEI_SERVICES          *PeiService;\r
-  IA32_IDT_GATE_DESCRIPTOR  IdtTable[SEC_IDT_ENTRY_COUNT];\r
+  EFI_PEI_SERVICES            *PeiService;\r
+  IA32_IDT_GATE_DESCRIPTOR    IdtTable[SEC_IDT_ENTRY_COUNT];\r
 } SEC_IDT_TABLE;\r
 \r
 VOID\r
 EFIAPI\r
 SecStartupPhase2 (\r
-  IN VOID                     *Context\r
+  IN VOID  *Context\r
   );\r
 \r
 EFI_STATUS\r
 EFIAPI\r
 TemporaryRamMigration (\r
-  IN CONST EFI_PEI_SERVICES   **PeiServices,\r
-  IN EFI_PHYSICAL_ADDRESS     TemporaryMemoryBase,\r
-  IN EFI_PHYSICAL_ADDRESS     PermanentMemoryBase,\r
-  IN UINTN                    CopySize\r
+  IN CONST EFI_PEI_SERVICES  **PeiServices,\r
+  IN EFI_PHYSICAL_ADDRESS    TemporaryMemoryBase,\r
+  IN EFI_PHYSICAL_ADDRESS    PermanentMemoryBase,\r
+  IN UINTN                   CopySize\r
   );\r
 \r
 //\r
 //\r
-//  \r
-EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI mTemporaryRamSupportPpi = {\r
+//\r
+EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI  mTemporaryRamSupportPpi = {\r
   TemporaryRamMigration\r
 };\r
 \r
-EFI_PEI_PPI_DESCRIPTOR mPrivateDispatchTable[] = {\r
+EFI_PEI_PPI_DESCRIPTOR  mPrivateDispatchTable[] = {\r
   {\r
     (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
     &gEfiTemporaryRamSupportPpiGuid,\r
@@ -80,7 +79,7 @@ IA32_IDT_GATE_DESCRIPTOR  mIdtEntryTemplate = {
     0x0,                                 // Reserved_0\r
     IA32_IDT_GATE_TYPE_INTERRUPT_32,     // GateType\r
     0xffff                               // OffsetHigh\r
-  }    \r
+  }\r
 };\r
 \r
 /**\r
@@ -95,18 +94,18 @@ IA32_IDT_GATE_DESCRIPTOR  mIdtEntryTemplate = {
 **/\r
 EFI_STATUS\r
 FindMainFv (\r
-  IN OUT  EFI_FIRMWARE_VOLUME_HEADER   **BootFv\r
+  IN OUT  EFI_FIRMWARE_VOLUME_HEADER  **BootFv\r
   )\r
 {\r
   EFI_FIRMWARE_VOLUME_HEADER  *Fv;\r
   UINTN                       Distance;\r
 \r
-  ASSERT (((UINTN) *BootFv & EFI_PAGE_MASK) == 0);\r
+  ASSERT (((UINTN)*BootFv & EFI_PAGE_MASK) == 0);\r
 \r
-  Fv = *BootFv;\r
-  Distance = (UINTN) (*BootFv)->FvLength;\r
+  Fv       = *BootFv;\r
+  Distance = (UINTN)(*BootFv)->FvLength;\r
   do {\r
-    Fv = (EFI_FIRMWARE_VOLUME_HEADER*) ((UINT8*) Fv - EFI_PAGE_SIZE);\r
+    Fv        = (EFI_FIRMWARE_VOLUME_HEADER *)((UINT8 *)Fv - EFI_PAGE_SIZE);\r
     Distance += EFI_PAGE_SIZE;\r
     if (Distance > SIZE_32MB) {\r
       return EFI_NOT_FOUND;\r
@@ -116,13 +115,12 @@ FindMainFv (
       continue;\r
     }\r
 \r
-    if ((UINTN) Fv->FvLength > Distance) {\r
+    if ((UINTN)Fv->FvLength > Distance) {\r
       continue;\r
     }\r
 \r
     *BootFv = Fv;\r
     return EFI_SUCCESS;\r
-\r
   } while (TRUE);\r
 }\r
 \r
@@ -146,34 +144,35 @@ FindMainFv (
 **/\r
 EFI_STATUS\r
 FindFfsSectionInstance (\r
-  IN  VOID                             *Sections,\r
-  IN  UINTN                            SizeOfSections,\r
-  IN  EFI_SECTION_TYPE                 SectionType,\r
-  IN  UINTN                            Instance,\r
-  OUT EFI_COMMON_SECTION_HEADER        **FoundSection\r
+  IN  VOID                       *Sections,\r
+  IN  UINTN                      SizeOfSections,\r
+  IN  EFI_SECTION_TYPE           SectionType,\r
+  IN  UINTN                      Instance,\r
+  OUT EFI_COMMON_SECTION_HEADER  **FoundSection\r
   )\r
 {\r
-  EFI_PHYSICAL_ADDRESS        CurrentAddress;\r
-  UINT32                      Size;\r
-  EFI_PHYSICAL_ADDRESS        EndOfSections;\r
-  EFI_COMMON_SECTION_HEADER   *Section;\r
-  EFI_PHYSICAL_ADDRESS        EndOfSection;\r
+  EFI_PHYSICAL_ADDRESS       CurrentAddress;\r
+  UINT32                     Size;\r
+  EFI_PHYSICAL_ADDRESS       EndOfSections;\r
+  EFI_COMMON_SECTION_HEADER  *Section;\r
+  EFI_PHYSICAL_ADDRESS       EndOfSection;\r
 \r
   //\r
   // Loop through the FFS file sections within the PEI Core FFS file\r
   //\r
-  EndOfSection = (EFI_PHYSICAL_ADDRESS)(UINTN) Sections;\r
+  EndOfSection  = (EFI_PHYSICAL_ADDRESS)(UINTN)Sections;\r
   EndOfSections = EndOfSection + SizeOfSections;\r
-  for (;;) {\r
+  for ( ; ;) {\r
     if (EndOfSection == EndOfSections) {\r
       break;\r
     }\r
+\r
     CurrentAddress = (EndOfSection + 3) & ~(3ULL);\r
     if (CurrentAddress >= EndOfSections) {\r
       return EFI_VOLUME_CORRUPTED;\r
     }\r
 \r
-    Section = (EFI_COMMON_SECTION_HEADER*)(UINTN) CurrentAddress;\r
+    Section = (EFI_COMMON_SECTION_HEADER *)(UINTN)CurrentAddress;\r
 \r
     Size = SECTION_SIZE (Section);\r
     if (Size < sizeof (*Section)) {\r
@@ -217,10 +216,10 @@ FindFfsSectionInstance (
 **/\r
 EFI_STATUS\r
 FindFfsSectionInSections (\r
-  IN  VOID                             *Sections,\r
-  IN  UINTN                            SizeOfSections,\r
-  IN  EFI_SECTION_TYPE                 SectionType,\r
-  OUT EFI_COMMON_SECTION_HEADER        **FoundSection\r
+  IN  VOID                       *Sections,\r
+  IN  UINTN                      SizeOfSections,\r
+  IN  EFI_SECTION_TYPE           SectionType,\r
+  OUT EFI_COMMON_SECTION_HEADER  **FoundSection\r
   )\r
 {\r
   return FindFfsSectionInstance (\r
@@ -248,39 +247,38 @@ FindFfsSectionInSections (
 **/\r
 EFI_STATUS\r
 FindFfsFileAndSection (\r
-  IN  EFI_FIRMWARE_VOLUME_HEADER       *Fv,\r
-  IN  EFI_FV_FILETYPE                  FileType,\r
-  IN  EFI_SECTION_TYPE                 SectionType,\r
-  OUT EFI_COMMON_SECTION_HEADER        **FoundSection\r
+  IN  EFI_FIRMWARE_VOLUME_HEADER  *Fv,\r
+  IN  EFI_FV_FILETYPE             FileType,\r
+  IN  EFI_SECTION_TYPE            SectionType,\r
+  OUT EFI_COMMON_SECTION_HEADER   **FoundSection\r
   )\r
 {\r
-  EFI_STATUS                  Status;\r
-  EFI_PHYSICAL_ADDRESS        CurrentAddress;\r
-  EFI_PHYSICAL_ADDRESS        EndOfFirmwareVolume;\r
-  EFI_FFS_FILE_HEADER         *File;\r
-  UINT32                      Size;\r
-  EFI_PHYSICAL_ADDRESS        EndOfFile;\r
+  EFI_STATUS            Status;\r
+  EFI_PHYSICAL_ADDRESS  CurrentAddress;\r
+  EFI_PHYSICAL_ADDRESS  EndOfFirmwareVolume;\r
+  EFI_FFS_FILE_HEADER   *File;\r
+  UINT32                Size;\r
+  EFI_PHYSICAL_ADDRESS  EndOfFile;\r
 \r
   if (Fv->Signature != EFI_FVH_SIGNATURE) {\r
-    DEBUG ((EFI_D_ERROR, "FV at %p does not have FV header signature\n", Fv));\r
+    DEBUG ((DEBUG_ERROR, "FV at %p does not have FV header signature\n", Fv));\r
     return EFI_VOLUME_CORRUPTED;\r
   }\r
 \r
-  CurrentAddress = (EFI_PHYSICAL_ADDRESS)(UINTN) Fv;\r
+  CurrentAddress      = (EFI_PHYSICAL_ADDRESS)(UINTN)Fv;\r
   EndOfFirmwareVolume = CurrentAddress + Fv->FvLength;\r
 \r
   //\r
   // Loop through the FFS files in the Boot Firmware Volume\r
   //\r
   for (EndOfFile = CurrentAddress + Fv->HeaderLength; ; ) {\r
-\r
     CurrentAddress = (EndOfFile + 7) & ~(7ULL);\r
     if (CurrentAddress > EndOfFirmwareVolume) {\r
       return EFI_VOLUME_CORRUPTED;\r
     }\r
 \r
-    File = (EFI_FFS_FILE_HEADER*)(UINTN) CurrentAddress;\r
-    Size = *(UINT32*) File->Size & 0xffffff;\r
+    File = (EFI_FFS_FILE_HEADER *)(UINTN)CurrentAddress;\r
+    Size = FFS_FILE_SIZE (File);\r
     if (Size < (sizeof (*File) + sizeof (EFI_COMMON_SECTION_HEADER))) {\r
       return EFI_VOLUME_CORRUPTED;\r
     }\r
@@ -298,8 +296,8 @@ FindFfsFileAndSection (
     }\r
 \r
     Status = FindFfsSectionInSections (\r
-               (VOID*) (File + 1),\r
-               (UINTN) EndOfFile - (UINTN) (File + 1),\r
+               (VOID *)(File + 1),\r
+               (UINTN)EndOfFile - (UINTN)(File + 1),\r
                SectionType,\r
                FoundSection\r
                );\r
@@ -322,31 +320,33 @@ FindFfsFileAndSection (
 **/\r
 EFI_STATUS\r
 DecompressMemFvs (\r
-  IN OUT EFI_FIRMWARE_VOLUME_HEADER       **Fv\r
+  IN OUT EFI_FIRMWARE_VOLUME_HEADER  **Fv\r
   )\r
 {\r
-  EFI_STATUS                        Status;\r
-  EFI_GUID_DEFINED_SECTION          *Section;\r
-  UINT32                            OutputBufferSize;\r
-  UINT32                            ScratchBufferSize;\r
-  UINT16                            SectionAttribute;\r
-  UINT32                            AuthenticationStatus;\r
-  VOID                              *OutputBuffer;\r
-  VOID                              *ScratchBuffer;\r
-  EFI_COMMON_SECTION_HEADER         *FvSection;\r
-  EFI_FIRMWARE_VOLUME_HEADER        *PeiMemFv;\r
-  EFI_FIRMWARE_VOLUME_HEADER        *DxeMemFv;\r
-\r
-  FvSection = (EFI_COMMON_SECTION_HEADER*) NULL;\r
+  EFI_STATUS                  Status;\r
+  EFI_GUID_DEFINED_SECTION    *Section;\r
+  UINT32                      OutputBufferSize;\r
+  UINT32                      ScratchBufferSize;\r
+  UINT16                      SectionAttribute;\r
+  UINT32                      AuthenticationStatus;\r
+  VOID                        *OutputBuffer;\r
+  VOID                        *ScratchBuffer;\r
+  EFI_COMMON_SECTION_HEADER   *FvSection;\r
+  EFI_FIRMWARE_VOLUME_HEADER  *PeiMemFv;\r
+  EFI_FIRMWARE_VOLUME_HEADER  *DxeMemFv;\r
+  UINT32                      FvHeaderSize;\r
+  UINT32                      FvSectionSize;\r
+\r
+  FvSection = (EFI_COMMON_SECTION_HEADER *)NULL;\r
 \r
   Status = FindFfsFileAndSection (\r
              *Fv,\r
              EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE,\r
              EFI_SECTION_GUID_DEFINED,\r
-             (EFI_COMMON_SECTION_HEADER**) &Section\r
+             (EFI_COMMON_SECTION_HEADER **)&Section\r
              );\r
   if (EFI_ERROR (Status)) {\r
-    DEBUG ((EFI_D_ERROR, "Unable to find GUID defined section\n"));\r
+    DEBUG ((DEBUG_ERROR, "Unable to find GUID defined section\n"));\r
     return Status;\r
   }\r
 \r
@@ -357,19 +357,28 @@ DecompressMemFvs (
              &SectionAttribute\r
              );\r
   if (EFI_ERROR (Status)) {\r
-    DEBUG ((EFI_D_ERROR, "Unable to GetInfo for GUIDed section\n"));\r
+    DEBUG ((DEBUG_ERROR, "Unable to GetInfo for GUIDed section\n"));\r
     return Status;\r
   }\r
 \r
-  OutputBuffer = (VOID*) ((UINT8*)(UINTN) PcdGet32 (PcdOvmfDxeMemFvBase) + SIZE_1MB);\r
-  ScratchBuffer = ALIGN_POINTER ((UINT8*) OutputBuffer + OutputBufferSize, SIZE_1MB);\r
-\r
-  DEBUG ((EFI_D_VERBOSE, "%a: OutputBuffer@%p+0x%x ScratchBuffer@%p+0x%x "\r
-    "PcdOvmfDecompressionScratchEnd=0x%x\n", __FUNCTION__, OutputBuffer,\r
-    OutputBufferSize, ScratchBuffer, ScratchBufferSize,\r
-    PcdGet32 (PcdOvmfDecompressionScratchEnd)));\r
-  ASSERT ((UINTN)ScratchBuffer + ScratchBufferSize ==\r
-    PcdGet32 (PcdOvmfDecompressionScratchEnd));\r
+  OutputBuffer  = (VOID *)((UINT8 *)(UINTN)PcdGet32 (PcdOvmfDxeMemFvBase) + SIZE_1MB);\r
+  ScratchBuffer = ALIGN_POINTER ((UINT8 *)OutputBuffer + OutputBufferSize, SIZE_1MB);\r
+\r
+  DEBUG ((\r
+    DEBUG_VERBOSE,\r
+    "%a: OutputBuffer@%p+0x%x ScratchBuffer@%p+0x%x "\r
+    "PcdOvmfDecompressionScratchEnd=0x%x\n",\r
+    __FUNCTION__,\r
+    OutputBuffer,\r
+    OutputBufferSize,\r
+    ScratchBuffer,\r
+    ScratchBufferSize,\r
+    PcdGet32 (PcdOvmfDecompressionScratchEnd)\r
+    ));\r
+  ASSERT (\r
+    (UINTN)ScratchBuffer + ScratchBufferSize ==\r
+    PcdGet32 (PcdOvmfDecompressionScratchEnd)\r
+    );\r
 \r
   Status = ExtractGuidedSectionDecode (\r
              Section,\r
@@ -378,7 +387,7 @@ DecompressMemFvs (
              &AuthenticationStatus\r
              );\r
   if (EFI_ERROR (Status)) {\r
-    DEBUG ((EFI_D_ERROR, "Error during GUID section decode\n"));\r
+    DEBUG ((DEBUG_ERROR, "Error during GUID section decode\n"));\r
     return Status;\r
   }\r
 \r
@@ -390,19 +399,21 @@ DecompressMemFvs (
              &FvSection\r
              );\r
   if (EFI_ERROR (Status)) {\r
-    DEBUG ((EFI_D_ERROR, "Unable to find PEI FV section\n"));\r
+    DEBUG ((DEBUG_ERROR, "Unable to find PEI FV section\n"));\r
     return Status;\r
   }\r
 \r
-  ASSERT (SECTION_SIZE (FvSection) ==\r
-          (PcdGet32 (PcdOvmfPeiMemFvSize) + sizeof (*FvSection)));\r
+  ASSERT (\r
+    SECTION_SIZE (FvSection) ==\r
+    (PcdGet32 (PcdOvmfPeiMemFvSize) + sizeof (*FvSection))\r
+    );\r
   ASSERT (FvSection->Type == EFI_SECTION_FIRMWARE_VOLUME_IMAGE);\r
 \r
-  PeiMemFv = (EFI_FIRMWARE_VOLUME_HEADER*)(UINTN) PcdGet32 (PcdOvmfPeiMemFvBase);\r
-  CopyMem (PeiMemFv, (VOID*) (FvSection + 1), PcdGet32 (PcdOvmfPeiMemFvSize));\r
+  PeiMemFv = (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)PcdGet32 (PcdOvmfPeiMemFvBase);\r
+  CopyMem (PeiMemFv, (VOID *)(FvSection + 1), PcdGet32 (PcdOvmfPeiMemFvSize));\r
 \r
   if (PeiMemFv->Signature != EFI_FVH_SIGNATURE) {\r
-    DEBUG ((EFI_D_ERROR, "Extracted FV at %p does not have FV header signature\n", PeiMemFv));\r
+    DEBUG ((DEBUG_ERROR, "Extracted FV at %p does not have FV header signature\n", PeiMemFv));\r
     CpuDeadLoop ();\r
     return EFI_VOLUME_CORRUPTED;\r
   }\r
@@ -415,19 +426,27 @@ DecompressMemFvs (
              &FvSection\r
              );\r
   if (EFI_ERROR (Status)) {\r
-    DEBUG ((EFI_D_ERROR, "Unable to find DXE FV section\n"));\r
+    DEBUG ((DEBUG_ERROR, "Unable to find DXE FV section\n"));\r
     return Status;\r
   }\r
 \r
   ASSERT (FvSection->Type == EFI_SECTION_FIRMWARE_VOLUME_IMAGE);\r
-  ASSERT (SECTION_SIZE (FvSection) ==\r
-          (PcdGet32 (PcdOvmfDxeMemFvSize) + sizeof (*FvSection)));\r
 \r
-  DxeMemFv = (EFI_FIRMWARE_VOLUME_HEADER*)(UINTN) PcdGet32 (PcdOvmfDxeMemFvBase);\r
-  CopyMem (DxeMemFv, (VOID*) (FvSection + 1), PcdGet32 (PcdOvmfDxeMemFvSize));\r
+  if (IS_SECTION2 (FvSection)) {\r
+    FvSectionSize = SECTION2_SIZE (FvSection);\r
+    FvHeaderSize  = sizeof (EFI_COMMON_SECTION_HEADER2);\r
+  } else {\r
+    FvSectionSize = SECTION_SIZE (FvSection);\r
+    FvHeaderSize  = sizeof (EFI_COMMON_SECTION_HEADER);\r
+  }\r
+\r
+  ASSERT (FvSectionSize == (PcdGet32 (PcdOvmfDxeMemFvSize) + FvHeaderSize));\r
+\r
+  DxeMemFv = (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)PcdGet32 (PcdOvmfDxeMemFvBase);\r
+  CopyMem (DxeMemFv, (VOID *)((UINTN)FvSection + FvHeaderSize), PcdGet32 (PcdOvmfDxeMemFvSize));\r
 \r
   if (DxeMemFv->Signature != EFI_FVH_SIGNATURE) {\r
-    DEBUG ((EFI_D_ERROR, "Extracted FV at %p does not have FV header signature\n", DxeMemFv));\r
+    DEBUG ((DEBUG_ERROR, "Extracted FV at %p does not have FV header signature\n", DxeMemFv));\r
     CpuDeadLoop ();\r
     return EFI_VOLUME_CORRUPTED;\r
   }\r
@@ -449,12 +468,12 @@ DecompressMemFvs (
 **/\r
 EFI_STATUS\r
 FindPeiCoreImageBaseInFv (\r
-  IN  EFI_FIRMWARE_VOLUME_HEADER       *Fv,\r
-  OUT  EFI_PHYSICAL_ADDRESS             *PeiCoreImageBase\r
+  IN  EFI_FIRMWARE_VOLUME_HEADER  *Fv,\r
+  OUT  EFI_PHYSICAL_ADDRESS       *PeiCoreImageBase\r
   )\r
 {\r
-  EFI_STATUS                  Status;\r
-  EFI_COMMON_SECTION_HEADER   *Section;\r
+  EFI_STATUS                 Status;\r
+  EFI_COMMON_SECTION_HEADER  *Section;\r
 \r
   Status = FindFfsFileAndSection (\r
              Fv,\r
@@ -470,7 +489,7 @@ FindPeiCoreImageBaseInFv (
                &Section\r
                );\r
     if (EFI_ERROR (Status)) {\r
-      DEBUG ((EFI_D_ERROR, "Unable to find PEI Core image\n"));\r
+      DEBUG ((DEBUG_ERROR, "Unable to find PEI Core image\n"));\r
       return Status;\r
     }\r
   }\r
@@ -479,7 +498,6 @@ FindPeiCoreImageBaseInFv (
   return EFI_SUCCESS;\r
 }\r
 \r
-\r
 /**\r
   Reads 8-bits of CMOS data.\r
 \r
@@ -494,14 +512,13 @@ FindPeiCoreImageBaseInFv (
 STATIC\r
 UINT8\r
 CmosRead8 (\r
-  IN      UINTN                     Index\r
+  IN      UINTN  Index\r
   )\r
 {\r
-  IoWrite8 (0x70, (UINT8) Index);\r
+  IoWrite8 (0x70, (UINT8)Index);\r
   return IoRead8 (0x71);\r
 }\r
 \r
-\r
 STATIC\r
 BOOLEAN\r
 IsS3Resume (\r
@@ -511,18 +528,16 @@ IsS3Resume (
   return (CmosRead8 (0xF) == 0xFE);\r
 }\r
 \r
-\r
 STATIC\r
 EFI_STATUS\r
 GetS3ResumePeiFv (\r
-  IN OUT EFI_FIRMWARE_VOLUME_HEADER       **PeiFv\r
+  IN OUT EFI_FIRMWARE_VOLUME_HEADER  **PeiFv\r
   )\r
 {\r
-  *PeiFv = (EFI_FIRMWARE_VOLUME_HEADER*)(UINTN) PcdGet32 (PcdOvmfPeiMemFvBase);\r
+  *PeiFv = (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)PcdGet32 (PcdOvmfPeiMemFvBase);\r
   return EFI_SUCCESS;\r
 }\r
 \r
-\r
 /**\r
   Locates the PEI Core entry point address\r
 \r
@@ -536,11 +551,11 @@ GetS3ResumePeiFv (
 **/\r
 VOID\r
 FindPeiCoreImageBase (\r
-  IN OUT  EFI_FIRMWARE_VOLUME_HEADER       **BootFv,\r
-     OUT  EFI_PHYSICAL_ADDRESS             *PeiCoreImageBase\r
+  IN OUT  EFI_FIRMWARE_VOLUME_HEADER  **BootFv,\r
+  OUT  EFI_PHYSICAL_ADDRESS           *PeiCoreImageBase\r
   )\r
 {\r
-  BOOLEAN S3Resume;\r
+  BOOLEAN  S3Resume;\r
 \r
   *PeiCoreImageBase = 0;\r
 \r
@@ -550,15 +565,18 @@ FindPeiCoreImageBase (
     // A malicious runtime OS may have injected something into our previously\r
     // decoded PEI FV, but we don't care about that unless SMM/SMRAM is required.\r
     //\r
-    DEBUG ((EFI_D_VERBOSE, "SEC: S3 resume\n"));\r
+    DEBUG ((DEBUG_VERBOSE, "SEC: S3 resume\n"));\r
     GetS3ResumePeiFv (BootFv);\r
   } else {\r
     //\r
     // We're either not resuming, or resuming "securely" -- we'll decompress\r
     // both PEI FV and DXE FV from pristine flash.\r
     //\r
-    DEBUG ((EFI_D_VERBOSE, "SEC: %a\n",\r
-      S3Resume ? "S3 resume (with PEI decompression)" : "Normal boot"));\r
+    DEBUG ((\r
+      DEBUG_VERBOSE,\r
+      "SEC: %a\n",\r
+      S3Resume ? "S3 resume (with PEI decompression)" : "Normal boot"\r
+      ));\r
     FindMainFv (BootFv);\r
 \r
     DecompressMemFvs (BootFv);\r
@@ -573,35 +591,34 @@ FindPeiCoreImageBase (
 **/\r
 EFI_STATUS\r
 FindImageBase (\r
-  IN  EFI_FIRMWARE_VOLUME_HEADER       *BootFirmwareVolumePtr,\r
-  OUT EFI_PHYSICAL_ADDRESS             *SecCoreImageBase\r
+  IN  EFI_FIRMWARE_VOLUME_HEADER  *BootFirmwareVolumePtr,\r
+  OUT EFI_PHYSICAL_ADDRESS        *SecCoreImageBase\r
   )\r
 {\r
-  EFI_PHYSICAL_ADDRESS        CurrentAddress;\r
-  EFI_PHYSICAL_ADDRESS        EndOfFirmwareVolume;\r
-  EFI_FFS_FILE_HEADER         *File;\r
-  UINT32                      Size;\r
-  EFI_PHYSICAL_ADDRESS        EndOfFile;\r
-  EFI_COMMON_SECTION_HEADER   *Section;\r
-  EFI_PHYSICAL_ADDRESS        EndOfSection;\r
+  EFI_PHYSICAL_ADDRESS       CurrentAddress;\r
+  EFI_PHYSICAL_ADDRESS       EndOfFirmwareVolume;\r
+  EFI_FFS_FILE_HEADER        *File;\r
+  UINT32                     Size;\r
+  EFI_PHYSICAL_ADDRESS       EndOfFile;\r
+  EFI_COMMON_SECTION_HEADER  *Section;\r
+  EFI_PHYSICAL_ADDRESS       EndOfSection;\r
 \r
   *SecCoreImageBase = 0;\r
 \r
-  CurrentAddress = (EFI_PHYSICAL_ADDRESS)(UINTN) BootFirmwareVolumePtr;\r
+  CurrentAddress      = (EFI_PHYSICAL_ADDRESS)(UINTN)BootFirmwareVolumePtr;\r
   EndOfFirmwareVolume = CurrentAddress + BootFirmwareVolumePtr->FvLength;\r
 \r
   //\r
   // Loop through the FFS files in the Boot Firmware Volume\r
   //\r
   for (EndOfFile = CurrentAddress + BootFirmwareVolumePtr->HeaderLength; ; ) {\r
-\r
     CurrentAddress = (EndOfFile + 7) & 0xfffffffffffffff8ULL;\r
     if (CurrentAddress > EndOfFirmwareVolume) {\r
       return EFI_NOT_FOUND;\r
     }\r
 \r
-    File = (EFI_FFS_FILE_HEADER*)(UINTN) CurrentAddress;\r
-    Size = *(UINT32*) File->Size & 0xffffff;\r
+    File = (EFI_FFS_FILE_HEADER *)(UINTN)CurrentAddress;\r
+    Size = FFS_FILE_SIZE (File);\r
     if (Size < sizeof (*File)) {\r
       return EFI_NOT_FOUND;\r
     }\r
@@ -621,12 +638,12 @@ FindImageBase (
     //\r
     // Loop through the FFS file sections within the FFS file\r
     //\r
-    EndOfSection = (EFI_PHYSICAL_ADDRESS)(UINTN) (File + 1);\r
-    for (;;) {\r
+    EndOfSection = (EFI_PHYSICAL_ADDRESS)(UINTN)(File + 1);\r
+    for ( ; ;) {\r
       CurrentAddress = (EndOfSection + 3) & 0xfffffffffffffffcULL;\r
-      Section = (EFI_COMMON_SECTION_HEADER*)(UINTN) CurrentAddress;\r
+      Section        = (EFI_COMMON_SECTION_HEADER *)(UINTN)CurrentAddress;\r
 \r
-      Size = *(UINT32*) Section->Size & 0xffffff;\r
+      Size = SECTION_SIZE (Section);\r
       if (Size < sizeof (*Section)) {\r
         return EFI_NOT_FOUND;\r
       }\r
@@ -639,10 +656,11 @@ FindImageBase (
       //\r
       // Look for executable sections\r
       //\r
-      if (Section->Type == EFI_SECTION_PE32 || Section->Type == EFI_SECTION_TE) {\r
+      if ((Section->Type == EFI_SECTION_PE32) || (Section->Type == EFI_SECTION_TE)) {\r
         if (File->Type == EFI_FV_FILETYPE_SECURITY_CORE) {\r
-          *SecCoreImageBase = (PHYSICAL_ADDRESS) (UINTN) (Section + 1);\r
+          *SecCoreImageBase = (PHYSICAL_ADDRESS)(UINTN)(Section + 1);\r
         }\r
+\r
         break;\r
       }\r
     }\r
@@ -659,48 +677,48 @@ FindImageBase (
 /*\r
   Find and return Pei Core entry point.\r
 \r
-  It also find SEC and PEI Core file debug inforamtion. It will report them if\r
+  It also find SEC and PEI Core file debug information. It will report them if\r
   remote debug is enabled.\r
 \r
 **/\r
 VOID\r
 FindAndReportEntryPoints (\r
-  IN  EFI_FIRMWARE_VOLUME_HEADER       **BootFirmwareVolumePtr,\r
-  OUT EFI_PEI_CORE_ENTRY_POINT         *PeiCoreEntryPoint\r
+  IN  EFI_FIRMWARE_VOLUME_HEADER  **BootFirmwareVolumePtr,\r
+  OUT EFI_PEI_CORE_ENTRY_POINT    *PeiCoreEntryPoint\r
   )\r
 {\r
-  EFI_STATUS                       Status;\r
-  EFI_PHYSICAL_ADDRESS             SecCoreImageBase;\r
-  EFI_PHYSICAL_ADDRESS             PeiCoreImageBase;\r
-  PE_COFF_LOADER_IMAGE_CONTEXT     ImageContext;\r
+  EFI_STATUS                    Status;\r
+  EFI_PHYSICAL_ADDRESS          SecCoreImageBase;\r
+  EFI_PHYSICAL_ADDRESS          PeiCoreImageBase;\r
+  PE_COFF_LOADER_IMAGE_CONTEXT  ImageContext;\r
 \r
   //\r
   // Find SEC Core and PEI Core image base\r
-   //\r
+  //\r
   Status = FindImageBase (*BootFirmwareVolumePtr, &SecCoreImageBase);\r
   ASSERT_EFI_ERROR (Status);\r
 \r
   FindPeiCoreImageBase (BootFirmwareVolumePtr, &PeiCoreImageBase);\r
-  \r
-  ZeroMem ((VOID *) &ImageContext, sizeof (PE_COFF_LOADER_IMAGE_CONTEXT));\r
+\r
+  ZeroMem ((VOID *)&ImageContext, sizeof (PE_COFF_LOADER_IMAGE_CONTEXT));\r
   //\r
   // Report SEC Core debug information when remote debug is enabled\r
   //\r
   ImageContext.ImageAddress = SecCoreImageBase;\r
-  ImageContext.PdbPointer = PeCoffLoaderGetPdbPointer ((VOID*) (UINTN) ImageContext.ImageAddress);\r
+  ImageContext.PdbPointer   = PeCoffLoaderGetPdbPointer ((VOID *)(UINTN)ImageContext.ImageAddress);\r
   PeCoffLoaderRelocateImageExtraAction (&ImageContext);\r
 \r
   //\r
   // Report PEI Core debug information when remote debug is enabled\r
   //\r
   ImageContext.ImageAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)PeiCoreImageBase;\r
-  ImageContext.PdbPointer = PeCoffLoaderGetPdbPointer ((VOID*) (UINTN) ImageContext.ImageAddress);\r
+  ImageContext.PdbPointer   = PeCoffLoaderGetPdbPointer ((VOID *)(UINTN)ImageContext.ImageAddress);\r
   PeCoffLoaderRelocateImageExtraAction (&ImageContext);\r
 \r
   //\r
   // Find PEI Core entry point\r
   //\r
-  Status = PeCoffLoaderGetEntryPoint ((VOID *) (UINTN) PeiCoreImageBase, (VOID**) PeiCoreEntryPoint);\r
+  Status = PeCoffLoaderGetEntryPoint ((VOID *)(UINTN)PeiCoreImageBase, (VOID **)PeiCoreEntryPoint);\r
   if (EFI_ERROR (Status)) {\r
     *PeiCoreEntryPoint = 0;\r
   }\r
@@ -708,34 +726,242 @@ FindAndReportEntryPoints (
   return;\r
 }\r
 \r
+/**\r
+  Handle an SEV-ES/GHCB protocol check failure.\r
+\r
+  Notify the hypervisor using the VMGEXIT instruction that the SEV-ES guest\r
+  wishes to be terminated.\r
+\r
+  @param[in] ReasonCode  Reason code to provide to the hypervisor for the\r
+                         termination request.\r
+\r
+**/\r
+STATIC\r
+VOID\r
+SevEsProtocolFailure (\r
+  IN UINT8  ReasonCode\r
+  )\r
+{\r
+  MSR_SEV_ES_GHCB_REGISTER  Msr;\r
+\r
+  //\r
+  // Use the GHCB MSR Protocol to request termination by the hypervisor\r
+  //\r
+  Msr.GhcbPhysicalAddress         = 0;\r
+  Msr.GhcbTerminate.Function      = GHCB_INFO_TERMINATE_REQUEST;\r
+  Msr.GhcbTerminate.ReasonCodeSet = GHCB_TERMINATE_GHCB;\r
+  Msr.GhcbTerminate.ReasonCode    = ReasonCode;\r
+  AsmWriteMsr64 (MSR_SEV_ES_GHCB, Msr.GhcbPhysicalAddress);\r
+\r
+  AsmVmgExit ();\r
+\r
+  ASSERT (FALSE);\r
+  CpuDeadLoop ();\r
+}\r
+\r
+/**\r
+  Validate the SEV-ES/GHCB protocol level.\r
+\r
+  Verify that the level of SEV-ES/GHCB protocol supported by the hypervisor\r
+  and the guest intersect. If they don't intersect, request termination.\r
+\r
+**/\r
+STATIC\r
+VOID\r
+SevEsProtocolCheck (\r
+  VOID\r
+  )\r
+{\r
+  MSR_SEV_ES_GHCB_REGISTER  Msr;\r
+  GHCB                      *Ghcb;\r
+\r
+  //\r
+  // Use the GHCB MSR Protocol to obtain the GHCB SEV-ES Information for\r
+  // protocol checking\r
+  //\r
+  Msr.GhcbPhysicalAddress = 0;\r
+  Msr.GhcbInfo.Function   = GHCB_INFO_SEV_INFO_GET;\r
+  AsmWriteMsr64 (MSR_SEV_ES_GHCB, Msr.GhcbPhysicalAddress);\r
+\r
+  AsmVmgExit ();\r
+\r
+  Msr.GhcbPhysicalAddress = AsmReadMsr64 (MSR_SEV_ES_GHCB);\r
+\r
+  if (Msr.GhcbInfo.Function != GHCB_INFO_SEV_INFO) {\r
+    SevEsProtocolFailure (GHCB_TERMINATE_GHCB_GENERAL);\r
+  }\r
+\r
+  if (Msr.GhcbProtocol.SevEsProtocolMin > Msr.GhcbProtocol.SevEsProtocolMax) {\r
+    SevEsProtocolFailure (GHCB_TERMINATE_GHCB_PROTOCOL);\r
+  }\r
+\r
+  if ((Msr.GhcbProtocol.SevEsProtocolMin > GHCB_VERSION_MAX) ||\r
+      (Msr.GhcbProtocol.SevEsProtocolMax < GHCB_VERSION_MIN))\r
+  {\r
+    SevEsProtocolFailure (GHCB_TERMINATE_GHCB_PROTOCOL);\r
+  }\r
+\r
+  //\r
+  // SEV-ES protocol checking succeeded, set the initial GHCB address\r
+  //\r
+  Msr.GhcbPhysicalAddress = FixedPcdGet32 (PcdOvmfSecGhcbBase);\r
+  AsmWriteMsr64 (MSR_SEV_ES_GHCB, Msr.GhcbPhysicalAddress);\r
+\r
+  Ghcb = Msr.Ghcb;\r
+  SetMem (Ghcb, sizeof (*Ghcb), 0);\r
+\r
+  //\r
+  // Set the version to the maximum that can be supported\r
+  //\r
+  Ghcb->ProtocolVersion = MIN (Msr.GhcbProtocol.SevEsProtocolMax, GHCB_VERSION_MAX);\r
+  Ghcb->GhcbUsage       = GHCB_STANDARD_USAGE;\r
+}\r
+\r
+/**\r
+ Determine if the SEV is active.\r
+\r
+ During the early booting, GuestType is set in the work area. Verify that it\r
+ is an SEV guest.\r
+\r
+ @retval TRUE   SEV is enabled\r
+ @retval FALSE  SEV is not enabled\r
+\r
+**/\r
+STATIC\r
+BOOLEAN\r
+IsSevGuest (\r
+  VOID\r
+  )\r
+{\r
+  OVMF_WORK_AREA  *WorkArea;\r
+\r
+  //\r
+  // Ensure that the size of the Confidential Computing work area header\r
+  // is same as what is provided through a fixed PCD.\r
+  //\r
+  ASSERT (\r
+    (UINTN)FixedPcdGet32 (PcdOvmfConfidentialComputingWorkAreaHeader) ==\r
+    sizeof (CONFIDENTIAL_COMPUTING_WORK_AREA_HEADER)\r
+    );\r
+\r
+  WorkArea = (OVMF_WORK_AREA *)FixedPcdGet32 (PcdOvmfWorkAreaBase);\r
+\r
+  return ((WorkArea != NULL) && (WorkArea->Header.GuestType == GUEST_TYPE_AMD_SEV));\r
+}\r
+\r
+/**\r
+  Determine if SEV-ES is active.\r
+\r
+  During early booting, SEV-ES support code will set a flag to indicate that\r
+  SEV-ES is enabled. Return the value of this flag as an indicator that SEV-ES\r
+  is enabled.\r
+\r
+  @retval TRUE   SEV-ES is enabled\r
+  @retval FALSE  SEV-ES is not enabled\r
+\r
+**/\r
+STATIC\r
+BOOLEAN\r
+SevEsIsEnabled (\r
+  VOID\r
+  )\r
+{\r
+  SEC_SEV_ES_WORK_AREA  *SevEsWorkArea;\r
+\r
+  if (!IsSevGuest ()) {\r
+    return FALSE;\r
+  }\r
+\r
+  SevEsWorkArea = (SEC_SEV_ES_WORK_AREA *)FixedPcdGet32 (PcdSevEsWorkAreaBase);\r
+\r
+  return (SevEsWorkArea->SevEsEnabled != 0);\r
+}\r
+\r
 VOID\r
 EFIAPI\r
 SecCoreStartupWithStack (\r
-  IN EFI_FIRMWARE_VOLUME_HEADER       *BootFv,\r
-  IN VOID                             *TopOfCurrentStack\r
+  IN EFI_FIRMWARE_VOLUME_HEADER  *BootFv,\r
+  IN VOID                        *TopOfCurrentStack\r
   )\r
 {\r
-  EFI_SEC_PEI_HAND_OFF        SecCoreData;\r
-  SEC_IDT_TABLE               IdtTableInStack;\r
-  IA32_DESCRIPTOR             IdtDescriptor;\r
-  UINT32                      Index;\r
-  volatile UINT8              *Table;\r
+  EFI_SEC_PEI_HAND_OFF  SecCoreData;\r
+  SEC_IDT_TABLE         IdtTableInStack;\r
+  IA32_DESCRIPTOR       IdtDescriptor;\r
+  UINT32                Index;\r
+  volatile UINT8        *Table;\r
 \r
   //\r
   // To ensure SMM can't be compromised on S3 resume, we must force re-init of\r
   // the BaseExtractGuidedSectionLib. Since this is before library contructors\r
   // are called, we must use a loop rather than SetMem.\r
   //\r
-  Table = (UINT8*)(UINTN)FixedPcdGet64 (PcdGuidedExtractHandlerTableAddress);\r
+  Table = (UINT8 *)(UINTN)FixedPcdGet64 (PcdGuidedExtractHandlerTableAddress);\r
   for (Index = 0;\r
        Index < FixedPcdGet32 (PcdGuidedExtractHandlerTableSize);\r
-       ++Index) {\r
+       ++Index)\r
+  {\r
     Table[Index] = 0;\r
   }\r
 \r
+  //\r
+  // Initialize IDT - Since this is before library constructors are called,\r
+  // we use a loop rather than CopyMem.\r
+  //\r
+  IdtTableInStack.PeiService = NULL;\r
+  for (Index = 0; Index < SEC_IDT_ENTRY_COUNT; Index++) {\r
+    UINT8  *Src;\r
+    UINT8  *Dst;\r
+    UINTN  Byte;\r
+\r
+    Src = (UINT8 *)&mIdtEntryTemplate;\r
+    Dst = (UINT8 *)&IdtTableInStack.IdtTable[Index];\r
+    for (Byte = 0; Byte < sizeof (mIdtEntryTemplate); Byte++) {\r
+      Dst[Byte] = Src[Byte];\r
+    }\r
+  }\r
+\r
+  IdtDescriptor.Base  = (UINTN)&IdtTableInStack.IdtTable;\r
+  IdtDescriptor.Limit = (UINT16)(sizeof (IdtTableInStack.IdtTable) - 1);\r
+\r
+  if (SevEsIsEnabled ()) {\r
+    SevEsProtocolCheck ();\r
+\r
+    //\r
+    // For SEV-ES guests, the exception handler is needed before calling\r
+    // ProcessLibraryConstructorList() because some of the library constructors\r
+    // perform some functions that result in #VC exceptions being generated.\r
+    //\r
+    // Due to this code executing before library constructors, *all* library\r
+    // API calls are theoretically interface contract violations. However,\r
+    // because this is SEC (executing in flash), those constructors cannot\r
+    // write variables with static storage duration anyway. Furthermore, only\r
+    // a small, restricted set of APIs, such as AsmWriteIdtr() and\r
+    // InitializeCpuExceptionHandlers(), are called, where we require that the\r
+    // underlying library not require constructors to have been invoked and\r
+    // that the library instance not trigger any #VC exceptions.\r
+    //\r
+    AsmWriteIdtr (&IdtDescriptor);\r
+    InitializeCpuExceptionHandlers (NULL);\r
+  }\r
+\r
   ProcessLibraryConstructorList (NULL, NULL);\r
 \r
-  DEBUG ((EFI_D_INFO,\r
+  if (!SevEsIsEnabled ()) {\r
+    //\r
+    // For non SEV-ES guests, just load the IDTR.\r
+    //\r
+    AsmWriteIdtr (&IdtDescriptor);\r
+  } else {\r
+    //\r
+    // Under SEV-ES, the hypervisor can't modify CR0 and so can't enable\r
+    // caching in order to speed up the boot. Enable caching early for\r
+    // an SEV-ES guest.\r
+    //\r
+    AsmEnableCache ();\r
+  }\r
+\r
+  DEBUG ((\r
+    DEBUG_INFO,\r
     "SecCoreStartupWithStack(0x%x, 0x%x)\n",\r
     (UINT32)(UINTN)BootFv,\r
     (UINT32)(UINTN)TopOfCurrentStack\r
@@ -747,26 +973,13 @@ SecCoreStartupWithStack (
   //\r
   InitializeFloatingPointUnits ();\r
 \r
-  //\r
-  // Initialize IDT\r
-  //  \r
-  IdtTableInStack.PeiService = NULL;\r
-  for (Index = 0; Index < SEC_IDT_ENTRY_COUNT; Index ++) {\r
-    CopyMem (&IdtTableInStack.IdtTable[Index], &mIdtEntryTemplate, sizeof (mIdtEntryTemplate));\r
-  }\r
-\r
-  IdtDescriptor.Base  = (UINTN)&IdtTableInStack.IdtTable;\r
-  IdtDescriptor.Limit = (UINT16)(sizeof (IdtTableInStack.IdtTable) - 1);\r
-\r
-  AsmWriteIdtr (&IdtDescriptor);\r
-\r
-#if defined (MDE_CPU_X64)\r
+ #if defined (MDE_CPU_X64)\r
   //\r
   // ASSERT that the Page Tables were set by the reset vector code to\r
   // the address we expect.\r
   //\r
-  ASSERT (AsmReadCr3 () == (UINTN) PcdGet32 (PcdOvmfSecPageTablesBase));\r
-#endif\r
+  ASSERT (AsmReadCr3 () == (UINTN)PcdGet32 (PcdOvmfSecPageTablesBase));\r
+ #endif\r
 \r
   //\r
   // |-------------|       <-- TopOfCurrentStack\r
@@ -776,26 +989,28 @@ SecCoreStartupWithStack (
   // |-------------|       <-- SecCoreData.TemporaryRamBase\r
   //\r
 \r
-  ASSERT ((UINTN) (PcdGet32 (PcdOvmfSecPeiTempRamBase) +\r
-                   PcdGet32 (PcdOvmfSecPeiTempRamSize)) ==\r
-          (UINTN) TopOfCurrentStack);\r
+  ASSERT (\r
+    (UINTN)(PcdGet32 (PcdOvmfSecPeiTempRamBase) +\r
+            PcdGet32 (PcdOvmfSecPeiTempRamSize)) ==\r
+    (UINTN)TopOfCurrentStack\r
+    );\r
 \r
   //\r
   // Initialize SEC hand-off state\r
   //\r
-  SecCoreData.DataSize = sizeof(EFI_SEC_PEI_HAND_OFF);\r
+  SecCoreData.DataSize = sizeof (EFI_SEC_PEI_HAND_OFF);\r
 \r
-  SecCoreData.TemporaryRamSize       = (UINTN) PcdGet32 (PcdOvmfSecPeiTempRamSize);\r
-  SecCoreData.TemporaryRamBase       = (VOID*)((UINT8 *)TopOfCurrentStack - SecCoreData.TemporaryRamSize);\r
+  SecCoreData.TemporaryRamSize = (UINTN)PcdGet32 (PcdOvmfSecPeiTempRamSize);\r
+  SecCoreData.TemporaryRamBase = (VOID *)((UINT8 *)TopOfCurrentStack - SecCoreData.TemporaryRamSize);\r
 \r
-  SecCoreData.PeiTemporaryRamBase    = SecCoreData.TemporaryRamBase;\r
-  SecCoreData.PeiTemporaryRamSize    = SecCoreData.TemporaryRamSize >> 1;\r
+  SecCoreData.PeiTemporaryRamBase = SecCoreData.TemporaryRamBase;\r
+  SecCoreData.PeiTemporaryRamSize = SecCoreData.TemporaryRamSize >> 1;\r
 \r
-  SecCoreData.StackBase              = (UINT8 *)SecCoreData.TemporaryRamBase + SecCoreData.PeiTemporaryRamSize;\r
-  SecCoreData.StackSize              = SecCoreData.TemporaryRamSize >> 1;\r
+  SecCoreData.StackBase = (UINT8 *)SecCoreData.TemporaryRamBase + SecCoreData.PeiTemporaryRamSize;\r
+  SecCoreData.StackSize = SecCoreData.TemporaryRamSize >> 1;\r
 \r
   SecCoreData.BootFirmwareVolumeBase = BootFv;\r
-  SecCoreData.BootFirmwareVolumeSize = (UINTN) BootFv->FvLength;\r
+  SecCoreData.BootFirmwareVolumeSize = (UINTN)BootFv->FvLength;\r
 \r
   //\r
   // Make sure the 8259 is masked before initializing the Debug Agent and the debug timer is enabled\r
@@ -810,13 +1025,13 @@ SecCoreStartupWithStack (
   //\r
   InitializeApicTimer (0, MAX_UINT32, TRUE, 5);\r
   DisableApicTimerInterrupt ();\r
-  \r
+\r
   //\r
   // Initialize Debug Agent to support source level debug in SEC/PEI phases before memory ready.\r
   //\r
   InitializeDebugAgent (DEBUG_AGENT_INIT_PREMEM_SEC, &SecCoreData, SecStartupPhase2);\r
 }\r
-  \r
+\r
 /**\r
   Caller provided function to be invoked at the end of InitializeDebugAgent().\r
 \r
@@ -829,16 +1044,16 @@ SecCoreStartupWithStack (
 **/\r
 VOID\r
 EFIAPI\r
-SecStartupPhase2(\r
-  IN VOID                     *Context\r
+SecStartupPhase2 (\r
+  IN VOID  *Context\r
   )\r
 {\r
   EFI_SEC_PEI_HAND_OFF        *SecCoreData;\r
   EFI_FIRMWARE_VOLUME_HEADER  *BootFv;\r
   EFI_PEI_CORE_ENTRY_POINT    PeiCoreEntryPoint;\r
-  \r
-  SecCoreData = (EFI_SEC_PEI_HAND_OFF *) Context;\r
-  \r
+\r
+  SecCoreData = (EFI_SEC_PEI_HAND_OFF *)Context;\r
+\r
   //\r
   // Find PEI Core entry point. It will report SEC and Pei Core debug information if remote debug\r
   // is enabled.\r
@@ -846,13 +1061,13 @@ SecStartupPhase2(
   BootFv = (EFI_FIRMWARE_VOLUME_HEADER *)SecCoreData->BootFirmwareVolumeBase;\r
   FindAndReportEntryPoints (&BootFv, &PeiCoreEntryPoint);\r
   SecCoreData->BootFirmwareVolumeBase = BootFv;\r
-  SecCoreData->BootFirmwareVolumeSize = (UINTN) BootFv->FvLength;\r
+  SecCoreData->BootFirmwareVolumeSize = (UINTN)BootFv->FvLength;\r
 \r
   //\r
   // Transfer the control to the PEI core\r
   //\r
-  (*PeiCoreEntryPoint) (SecCoreData, (EFI_PEI_PPI_DESCRIPTOR *)&mPrivateDispatchTable);\r
-  \r
+  (*PeiCoreEntryPoint)(SecCoreData, (EFI_PEI_PPI_DESCRIPTOR *)&mPrivateDispatchTable);\r
+\r
   //\r
   // If we get here then the PEI Core returned, which is not recoverable.\r
   //\r
@@ -863,10 +1078,10 @@ SecStartupPhase2(
 EFI_STATUS\r
 EFIAPI\r
 TemporaryRamMigration (\r
-  IN CONST EFI_PEI_SERVICES   **PeiServices,\r
-  IN EFI_PHYSICAL_ADDRESS     TemporaryMemoryBase,\r
-  IN EFI_PHYSICAL_ADDRESS     PermanentMemoryBase,\r
-  IN UINTN                    CopySize\r
+  IN CONST EFI_PEI_SERVICES  **PeiServices,\r
+  IN EFI_PHYSICAL_ADDRESS    TemporaryMemoryBase,\r
+  IN EFI_PHYSICAL_ADDRESS    PermanentMemoryBase,\r
+  IN UINTN                   CopySize\r
   )\r
 {\r
   IA32_DESCRIPTOR                  IdtDescriptor;\r
@@ -877,25 +1092,26 @@ TemporaryRamMigration (
   DEBUG_AGENT_CONTEXT_POSTMEM_SEC  DebugAgentContext;\r
   BOOLEAN                          OldStatus;\r
   BASE_LIBRARY_JUMP_BUFFER         JumpBuffer;\r
-  \r
-  DEBUG ((EFI_D_INFO,\r
+\r
+  DEBUG ((\r
+    DEBUG_INFO,\r
     "TemporaryRamMigration(0x%Lx, 0x%Lx, 0x%Lx)\n",\r
     TemporaryMemoryBase,\r
     PermanentMemoryBase,\r
     (UINT64)CopySize\r
     ));\r
-  \r
-  OldHeap = (VOID*)(UINTN)TemporaryMemoryBase;\r
-  NewHeap = (VOID*)((UINTN)PermanentMemoryBase + (CopySize >> 1));\r
-  \r
-  OldStack = (VOID*)((UINTN)TemporaryMemoryBase + (CopySize >> 1));\r
-  NewStack = (VOID*)(UINTN)PermanentMemoryBase;\r
-\r
-  DebugAgentContext.HeapMigrateOffset = (UINTN)NewHeap - (UINTN)OldHeap;\r
+\r
+  OldHeap = (VOID *)(UINTN)TemporaryMemoryBase;\r
+  NewHeap = (VOID *)((UINTN)PermanentMemoryBase + (CopySize >> 1));\r
+\r
+  OldStack = (VOID *)((UINTN)TemporaryMemoryBase + (CopySize >> 1));\r
+  NewStack = (VOID *)(UINTN)PermanentMemoryBase;\r
+\r
+  DebugAgentContext.HeapMigrateOffset  = (UINTN)NewHeap - (UINTN)OldHeap;\r
   DebugAgentContext.StackMigrateOffset = (UINTN)NewStack - (UINTN)OldStack;\r
-  \r
+\r
   OldStatus = SaveAndSetDebugTimerInterrupt (FALSE);\r
-  InitializeDebugAgent (DEBUG_AGENT_INIT_POSTMEM_SEC, (VOID *) &DebugAgentContext, NULL);\r
+  InitializeDebugAgent (DEBUG_AGENT_INIT_POSTMEM_SEC, (VOID *)&DebugAgentContext, NULL);\r
 \r
   //\r
   // Migrate Heap\r
@@ -906,7 +1122,7 @@ TemporaryRamMigration (
   // Migrate Stack\r
   //\r
   CopyMem (NewStack, OldStack, CopySize >> 1);\r
-  \r
+\r
   //\r
   // Rebase IDT table in permanent memory\r
   //\r
@@ -917,14 +1133,16 @@ TemporaryRamMigration (
 \r
   //\r
   // Use SetJump()/LongJump() to switch to a new stack.\r
-  // \r
+  //\r
   if (SetJump (&JumpBuffer) == 0) {\r
-#if defined (MDE_CPU_IA32)\r
+ #if defined (MDE_CPU_IA32)\r
     JumpBuffer.Esp = JumpBuffer.Esp + DebugAgentContext.StackMigrateOffset;\r
-#endif    \r
-#if defined (MDE_CPU_X64)\r
+    JumpBuffer.Ebp = JumpBuffer.Ebp + DebugAgentContext.StackMigrateOffset;\r
+ #endif\r
+ #if defined (MDE_CPU_X64)\r
     JumpBuffer.Rsp = JumpBuffer.Rsp + DebugAgentContext.StackMigrateOffset;\r
-#endif    \r
+    JumpBuffer.Rbp = JumpBuffer.Rbp + DebugAgentContext.StackMigrateOffset;\r
+ #endif\r
     LongJump (&JumpBuffer, (UINTN)-1);\r
   }\r
 \r
@@ -932,4 +1150,3 @@ TemporaryRamMigration (
 \r
   return EFI_SUCCESS;\r
 }\r
-\r