public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [edk2-devel][edk2-platforms][PATCH v4] MinPlatformPkg: Support SecFspWrapperPlatformSecLib in X64
@ 2024-01-02  9:40 Kuo, Ted
  2024-01-26  0:19 ` Chaganty, Rangasai V
  2024-01-29 23:39 ` Nate DeSimone
  0 siblings, 2 replies; 4+ messages in thread
From: Kuo, Ted @ 2024-01-02  9:40 UTC (permalink / raw)
  To: devel
  Cc: Sai Chaganty, Chasel Chiu, Nate DeSimone, Eric Dong, Ashraf Ali S,
	Chinni B Duggapu, Liming Gao

https://bugzilla.tianocore.org/show_bug.cgi?id=4623
1.Added PeiCoreEntry.nasm, SecEntry.nasm and Stack.nasm for X64.
2.Made changes in common files to support both IA32 and X64.
3.Added the PCDs below for FSP-T UPD revisions and reset vector in FSP.
 - PcdFspWrapperBfvforResetVectorInFsp
 - PcdFsptUpdHeaderRevision
 - PcdFsptArchUpdRevision

Cc: Sai Chaganty <rangasai.v.chaganty@intel.com>
Cc: Chasel Chiu <chasel.chiu@intel.com>
Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>
Cc: Eric Dong <eric.dong@intel.com>
Cc: Ashraf Ali S <ashraf.ali.s@intel.com>
Cc: Chinni B Duggapu <chinni.b.duggapu@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Signed-off-by: Ted Kuo <ted.kuo@intel.com>
---
 .../SecFspWrapperPlatformSecLib/FsptCoreUpd.h |  25 ++-
 .../Ia32/SecEntry.nasm                        |   4 +-
 .../SecFspWrapperPlatformSecLib.inf           |   9 +-
 ...pWrapperPlatformSecLibResetVectorInFsp.inf | 101 +++++++++
 .../SecGetPerformance.c                       |  11 +-
 .../SecPlatformInformation.c                  |   8 +-
 .../SecRamInitData.c                          |  73 +++++--
 .../X64/PeiCoreEntry.nasm                     | 202 ++++++++++++++++++
 .../X64/SecEntry.nasm                         |  71 ++++++
 .../X64/Stack.nasm                            |  72 +++++++
 .../Ia32 => Include}/Fsp.h                    |   6 +-
 .../Intel/MinPlatformPkg/MinPlatformPkg.dec   |  17 +-
 12 files changed, 565 insertions(+), 34 deletions(-)
 create mode 100644 Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecFspWrapperPlatformSecLibResetVectorInFsp.inf
 create mode 100644 Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/X64/PeiCoreEntry.nasm
 create mode 100644 Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/X64/SecEntry.nasm
 create mode 100644 Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/X64/Stack.nasm
 rename Platform/Intel/MinPlatformPkg/{FspWrapper/Library/SecFspWrapperPlatformSecLib/Ia32 => Include}/Fsp.h (79%)

diff --git a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/FsptCoreUpd.h b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/FsptCoreUpd.h
index 7c0f605b92..24c18f25b8 100644
--- a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/FsptCoreUpd.h
+++ b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/FsptCoreUpd.h
@@ -1,6 +1,6 @@
 /** @file
 
-Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2017 - 2024, Intel Corporation. All rights reserved.<BR>
 SPDX-License-Identifier: BSD-2-Clause-Patent
 
 **/
@@ -10,6 +10,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 
 #pragma pack(1)
 
+#if FixedPcdGet8 (PcdFsptArchUpdRevision) <= 1
 /** Fsp T Core UPD
 **/
 typedef struct {
@@ -34,6 +35,28 @@ typedef struct {
 **/
   UINT8                       Reserved[16];
 } FSPT_CORE_UPD;
+#else
+/** Fsp T Core UPD
+**/
+typedef struct {
+
+/** Offset 0x0040
+**/
+  EFI_PHYSICAL_ADDRESS        MicrocodeRegionBase;
+
+/** Offset 0x0048
+**/
+  UINT64                      MicrocodeRegionSize;
+
+/** Offset 0x0050
+**/
+  EFI_PHYSICAL_ADDRESS        CodeRegionBase;
+
+/** Offset 0x0058
+**/
+  UINT64                      CodeRegionSize;
+} FSPT_CORE_UPD;
+#endif
 
 #pragma pack()
 
diff --git a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/Ia32/SecEntry.nasm b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/Ia32/SecEntry.nasm
index 7f6d771e41..0b3f343991 100644
--- a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/Ia32/SecEntry.nasm
+++ b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/Ia32/SecEntry.nasm
@@ -1,6 +1,6 @@
 ;------------------------------------------------------------------------------
 ;
-; Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
+; Copyright (c) 2019 - 2024, Intel Corporation. All rights reserved.<BR>
 ; SPDX-License-Identifier: BSD-2-Clause-Patent
 ; Module Name:
 ;
@@ -13,7 +13,7 @@
 ;
 ;------------------------------------------------------------------------------
 
-#include "Fsp.h"
+#include <Fsp.h>
 
 SECTION .text
 
diff --git a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecFspWrapperPlatformSecLib.inf b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecFspWrapperPlatformSecLib.inf
index 2e0d67eae4..6806e000ce 100644
--- a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecFspWrapperPlatformSecLib.inf
+++ b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecFspWrapperPlatformSecLib.inf
@@ -1,7 +1,7 @@
 ## @file
-#  Provide FSP wrapper platform sec related function.
+#  Provide FSP wrapper platform sec related function for IA32.
 #
-#  Copyright (c) 2017 - 2021, Intel Corporation. All rights reserved.<BR>
+#  Copyright (c) 2017 - 2024, Intel Corporation. All rights reserved.<BR>
 #
 # SPDX-License-Identifier: BSD-2-Clause-Patent
 #
@@ -25,7 +25,7 @@
 #
 # The following information is for reference only and not required by the build tools.
 #
-#  VALID_ARCHITECTURES           = IA32 X64
+#  VALID_ARCHITECTURES           = IA32
 #
 
 ################################################################################
@@ -47,7 +47,6 @@
   Ia32/SecEntry.nasm
   Ia32/PeiCoreEntry.nasm
   Ia32/Stack.nasm
-  Ia32/Fsp.h
 
 ################################################################################
 #
@@ -96,3 +95,5 @@
   gIntelFsp2WrapperTokenSpaceGuid.PcdFspmBaseAddress                  ## CONSUMES
   gIntelFsp2WrapperTokenSpaceGuid.PcdFspModeSelection                 ## CONSUMES
   gMinPlatformPkgTokenSpaceGuid.PcdFspDispatchModeUseFspPeiMain       ## CONSUMES
+  gMinPlatformPkgTokenSpaceGuid.PcdFsptUpdHeaderRevision              ## CONSUMES
+  gMinPlatformPkgTokenSpaceGuid.PcdFsptArchUpdRevision                ## CONSUMES
diff --git a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecFspWrapperPlatformSecLibResetVectorInFsp.inf b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecFspWrapperPlatformSecLibResetVectorInFsp.inf
new file mode 100644
index 0000000000..ea062cfad1
--- /dev/null
+++ b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecFspWrapperPlatformSecLibResetVectorInFsp.inf
@@ -0,0 +1,101 @@
+## @file
+#  Provide FSP wrapper platform sec related function for X64.
+#
+#  Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+#
+##
+
+################################################################################
+#
+# Defines Section - statements that will be processed to create a Makefile.
+#
+################################################################################
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = SecFspWrapperPlatformSecLib
+  FILE_GUID                      = 94D8AA5C-5BAE-421F-B2C7-DD1A93BB4D3D
+  MODULE_TYPE                    = SEC
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = PlatformSecLib
+
+
+#
+# The following information is for reference only and not required by the build tools.
+# This library is only supported in X64 when reset vector is in FSP.
+#
+#  VALID_ARCHITECTURES           = X64
+#
+
+################################################################################
+#
+# Sources Section - list of files that are required for the build to succeed.
+#
+################################################################################
+
+[Sources]
+  FspWrapperPlatformSecLib.c
+  SecRamInitData.c
+  SecPlatformInformation.c
+  SecGetPerformance.c
+  SecTempRamDone.c
+  PlatformInit.c
+  FsptCoreUpd.h
+
+[Sources.X64]
+  X64/SecEntry.nasm
+  X64/PeiCoreEntry.nasm
+  X64/Stack.nasm
+
+################################################################################
+#
+# Package Dependency Section - list of Package files that are required for
+#                              this module.
+#
+################################################################################
+
+[Packages]
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  UefiCpuPkg/UefiCpuPkg.dec
+  IntelFsp2Pkg/IntelFsp2Pkg.dec
+  IntelFsp2WrapperPkg/IntelFsp2WrapperPkg.dec
+  MinPlatformPkg/MinPlatformPkg.dec
+
+[LibraryClasses]
+  LocalApicLib
+  SerialPortLib
+  FspWrapperPlatformLib
+  FspWrapperApiLib
+  SecBoardInitLib
+  TestPointCheckLib
+  PeiServicesTablePointerLib
+
+[Ppis]
+  gEfiSecPlatformInformationPpiGuid       ## CONSUMES
+  gPeiSecPerformancePpiGuid               ## CONSUMES
+  gTopOfTemporaryRamPpiGuid               ## PRODUCES
+  gEfiPeiFirmwareVolumeInfoPpiGuid        ## PRODUCES
+  gFspTempRamExitPpiGuid                  ## CONSUMES
+  gPlatformInitTempRamExitPpiGuid         ## CONSUMES
+
+[Pcd]
+  gUefiCpuPkgTokenSpaceGuid.PcdPeiTemporaryRamStackSize               ## CONSUMES
+  gIntelFsp2WrapperTokenSpaceGuid.PcdFsptBaseAddress                  ## CONSUMES
+  gIntelFsp2PkgTokenSpaceGuid.PcdFspTemporaryRamSize                  ## CONSUMES
+  gMinPlatformPkgTokenSpaceGuid.PcdSecSerialPortDebugEnable           ## CONSUMES
+
+[FixedPcd]
+  gMinPlatformPkgTokenSpaceGuid.PcdFlashFvMicrocodeBase               ## CONSUMES
+  gMinPlatformPkgTokenSpaceGuid.PcdFlashFvMicrocodeSize               ## CONSUMES
+  gMinPlatformPkgTokenSpaceGuid.PcdMicrocodeOffsetInFv                ## CONSUMES
+  gIntelFsp2WrapperTokenSpaceGuid.PcdFlashCodeCacheAddress            ## CONSUMES
+  gIntelFsp2WrapperTokenSpaceGuid.PcdFlashCodeCacheSize               ## CONSUMES
+  gIntelFsp2WrapperTokenSpaceGuid.PcdFspmBaseAddress                  ## CONSUMES
+  gIntelFsp2WrapperTokenSpaceGuid.PcdFspModeSelection                 ## CONSUMES
+  gMinPlatformPkgTokenSpaceGuid.PcdFspDispatchModeUseFspPeiMain       ## CONSUMES
+  gMinPlatformPkgTokenSpaceGuid.PcdFspWrapperBfvforResetVectorInFsp   ## CONSUMES
+  gMinPlatformPkgTokenSpaceGuid.PcdFsptUpdHeaderRevision              ## CONSUMES
+  gMinPlatformPkgTokenSpaceGuid.PcdFsptArchUpdRevision                ## CONSUMES
diff --git a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecGetPerformance.c b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecGetPerformance.c
index ac2deeabec..1699bd9710 100644
--- a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecGetPerformance.c
+++ b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecGetPerformance.c
@@ -1,7 +1,7 @@
 /** @file
   Sample to provide SecGetPerformance function.
 
-Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2017 - 2024, Intel Corporation. All rights reserved.<BR>
 SPDX-License-Identifier: BSD-2-Clause-Patent
 
 **/
@@ -58,6 +58,7 @@ SecGetPerformance (
   if (EFI_ERROR (Status)) {
     return EFI_NOT_FOUND;
   }
+
   //
   // |--------------| <- TopOfTemporaryRam - BL
   // |   List Ptr   |
@@ -77,12 +78,12 @@ SecGetPerformance (
   // |  TSC[31:00]  |
   // |--------------|
   //
-  TopOfTemporaryRam = (UINTN) TopOfTemporaryRamPpi - sizeof (UINT32);
-  TopOfTemporaryRam -= sizeof (UINT32) * 2;
-  Count             = *(UINT32 *)(TopOfTemporaryRam - sizeof (UINT32));
+  TopOfTemporaryRam = (UINTN) TopOfTemporaryRamPpi - sizeof (UINTN);
+  TopOfTemporaryRam -= sizeof(UINTN) * 2;
+  Count             = *(UINT32 *) (UINTN) (TopOfTemporaryRam - sizeof (UINT32));
   Size              = Count * sizeof (UINT32);
 
-  Ticker = *(UINT64 *) (TopOfTemporaryRam - sizeof (UINT32) - Size - sizeof (UINT32) * 2);
+  Ticker = *(UINT64 *) (UINTN) (TopOfTemporaryRam - sizeof (UINT32) - Size - sizeof (UINT64));
   Performance->ResetEnd = GetTimeInNanoSecond (Ticker);
 
   return EFI_SUCCESS;
diff --git a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecPlatformInformation.c b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecPlatformInformation.c
index 24d55ed838..4cbde95c2d 100644
--- a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecPlatformInformation.c
+++ b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecPlatformInformation.c
@@ -1,7 +1,7 @@
 /** @file
   Provide SecPlatformInformation function.
 
-Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2017 - 2024, Intel Corporation. All rights reserved.<BR>
 SPDX-License-Identifier: BSD-2-Clause-Patent
 
 **/
@@ -59,9 +59,9 @@ SecPlatformInformation (
   // This routine copies the BIST information to the buffer pointed by
   // PlatformInformationRecord for output.
   //
-  TopOfTemporaryRam = (UINTN) TopOfTemporaryRamPpi - sizeof (UINT32);
-  TopOfTemporaryRam -= sizeof (UINT32) * 2;
-  Count             = *((UINT32 *)(TopOfTemporaryRam - sizeof (UINT32)));
+  TopOfTemporaryRam = (UINTN) TopOfTemporaryRamPpi - sizeof (UINTN);
+  TopOfTemporaryRam -= sizeof (UINTN) * 2;
+  Count             = *((UINT32 *)(UINTN) (TopOfTemporaryRam - sizeof (UINT32)));
   Size              = Count * sizeof (IA32_HANDOFF_STATUS);
 
   if ((*StructureSize) < (UINT64) Size) {
diff --git a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecRamInitData.c b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecRamInitData.c
index 355d1e6509..49d5302a7b 100644
--- a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecRamInitData.c
+++ b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecRamInitData.c
@@ -1,7 +1,7 @@
 /** @file
   Provide TempRamInitParams data.
 
-Copyright (c) 2017 - 2021, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2017 - 2024, Intel Corporation. All rights reserved.<BR>
 SPDX-License-Identifier: BSD-2-Clause-Patent
 
 **/
@@ -12,25 +12,70 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 
 typedef struct {
   FSP_UPD_HEADER    FspUpdHeader;
+#if FixedPcdGet8 (PcdFsptArchUpdRevision) == 1
+  FSPT_ARCH_UPD     FsptArchUpd;
+#elif FixedPcdGet8 (PcdFsptArchUpdRevision) == 2
+  FSPT_ARCH2_UPD    FsptArchUpd;
+#endif
   FSPT_CORE_UPD     FsptCoreUpd;
-} FSPT_UPD_CORE_DATA;
+  UINT16            UpdTerminator;
+} FSPT_UPD_DATA;
 
-GLOBAL_REMOVE_IF_UNREFERENCED CONST FSPT_UPD_CORE_DATA FsptUpdDataPtr = {
+GLOBAL_REMOVE_IF_UNREFERENCED CONST FSPT_UPD_DATA FsptUpdDataPtr = {
   {
-    0x4450555F54505346,
-    0x00,
-    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+    0x4450555F54505346,                                           // FSP-T UPD Header Signature - FSPT_UPD
+    FixedPcdGet8 (PcdFsptUpdHeaderRevision),                      // FSP-T UPD Header Revision
+    {                                                             // Reserved[23]
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00
     }
   },
+#if FixedPcdGet8 (PcdFsptArchUpdRevision) == 1
   {
-    FixedPcdGet32 (PcdFlashFvMicrocodeBase) + FixedPcdGet32 (PcdMicrocodeOffsetInFv),
-    FixedPcdGet32 (PcdFlashFvMicrocodeSize) - FixedPcdGet32 (PcdMicrocodeOffsetInFv),
-    0,          // Set CodeRegionBase as 0, so that caching will be 4GB-(CodeRegionSize > LLCSize ? LLCSize : CodeRegionSize) will be used.
-    FixedPcdGet32 (PcdFlashCodeCacheSize),
-    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x01,                                                         // FSP-T ARCH UPD Revision
+    {                                                             // Reserved[3]
+      0x00, 0x00, 0x00
+    },
+    0x00000020,                                                   // Length of FSP-T ARCH UPD
+    0,                                                            // FspDebugHandler
+    {                                                             // Reserved1[20]
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+    }
+  },
+#elif FixedPcdGet8 (PcdFsptArchUpdRevision) == 2
+  {
+    0x02,                                                         // FSP-T ARCH2 UPD Revision
+    {                                                             // Reserved[3]
+      0x00, 0x00, 0x00
+    },
+    0x00000020,                                                   // Length of FSP-T ARCH2 UPD
+    0,                                                            // FspDebugHandler
+    {                                                             // Reserved1[16]
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
       0x00, 0x00, 0x00, 0x00, 0x00, 0x00
     }
-  }
+  },
+#endif
+#if FixedPcdGet8 (PcdFsptArchUpdRevision) <= 1
+  {
+    FixedPcdGet32 (PcdFlashFvMicrocodeBase) + FixedPcdGet32 (PcdMicrocodeOffsetInFv), // MicrocodeRegionBase
+    FixedPcdGet32 (PcdFlashFvMicrocodeSize) - FixedPcdGet32 (PcdMicrocodeOffsetInFv), // MicrocodeRegionSize
+    0, // Set CodeRegionBase as 0, so that caching will be 4GB-(CodeRegionSize > LLCSize ? LLCSize : CodeRegionSize) will be used.
+    FixedPcdGet32 (PcdFlashCodeCacheSize),                                            // CodeRegionSize
+    {                                                                                 // Reserved[16]
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+    }
+  },
+#else
+  {
+    FixedPcdGet32 (PcdFlashFvMicrocodeBase) + FixedPcdGet32 (PcdMicrocodeOffsetInFv), // MicrocodeRegionBase
+    FixedPcdGet32 (PcdFlashFvMicrocodeSize) - FixedPcdGet32 (PcdMicrocodeOffsetInFv), // MicrocodeRegionSize
+    0, // Set CodeRegionBase as 0, so that caching will be 4GB-(CodeRegionSize > LLCSize ? LLCSize : CodeRegionSize) will be used.
+    FixedPcdGet32 (PcdFlashCodeCacheSize)                                             // CodeRegionSize
+  },
+#endif
+  0x55AA
 };
-
diff --git a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/X64/PeiCoreEntry.nasm b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/X64/PeiCoreEntry.nasm
new file mode 100644
index 0000000000..af3affcf7f
--- /dev/null
+++ b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/X64/PeiCoreEntry.nasm
@@ -0,0 +1,202 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>
+; SPDX-License-Identifier: BSD-2-Clause-Patent
+;
+; Module Name:
+;
+;  PeiCoreEntry.nasm
+;
+; Abstract:
+;
+;   Find and call SecStartup
+;
+;------------------------------------------------------------------------------
+
+SECTION .text
+
+extern ASM_PFX(SecStartup)
+extern ASM_PFX(PlatformInit)
+extern ASM_PFX(PcdGet64 (PcdFspWrapperBfvforResetVectorInFsp))
+
+;-----------------------------------------------------------------------------
+;  Macro:        PUSHA_64
+;
+;  Description:  Saves all registers on stack
+;
+;  Input:        None
+;
+;  Output:       None
+;-----------------------------------------------------------------------------
+%macro PUSHA_64   0
+  push    r8
+  push    r9
+  push    r10
+  push    r11
+  push    r12
+  push    r13
+  push    r14
+  push    r15
+  push    rax
+  push    rcx
+  push    rdx
+  push    rbx
+  push    rsp
+  push    rbp
+  push    rsi
+  push    rdi
+%endmacro
+
+;-----------------------------------------------------------------------------
+;  Macro:        POPA_64
+;
+;  Description:  Restores all registers from stack
+;
+;  Input:        None
+;
+;  Output:       None
+;-----------------------------------------------------------------------------
+%macro POPA_64   0
+  pop    rdi
+  pop    rsi
+  pop    rbp
+  pop    rsp
+  pop    rbx
+  pop    rdx
+  pop    rcx
+  pop    rax
+  pop    r15
+  pop    r14
+  pop    r13
+  pop    r12
+  pop    r11
+  pop    r10
+  pop    r9
+  pop    r8
+%endmacro
+
+global ASM_PFX(CallPeiCoreEntryPoint)
+ASM_PFX(CallPeiCoreEntryPoint):
+  ;
+  ; Per X64 calling convention, make sure RSP is 16-byte aligned.
+  ;
+  mov     rax, rsp
+  and     rax, 0fh
+  sub     rsp, rax
+
+  ;
+  ; Platform init
+  ;
+  PUSHA_64
+  sub     rsp, 20h
+  call    ASM_PFX(PlatformInit)
+  add     rsp, 20h
+  POPA_64
+
+  ;
+  ; Set stack top pointer
+  ;
+  mov     rsp, r8
+
+  ;
+  ; Push the hob list pointer
+  ;
+  push    rcx
+
+  ;
+  ; RBP holds start of BFV passed from Vtf0. Save it to r10.
+  ;
+  mov     r10, rbp
+
+  ;
+  ; Save the value
+  ;   RDX: start of range
+  ;   r8: end of range
+  ;
+  mov     rbp, rsp
+  push    rdx
+  push    r8
+  mov     r14, rdx
+  mov     r15, r8
+
+  ;
+  ; Push processor count to stack first, then BIST status (AP then BSP)
+  ;
+  mov     eax, 1
+  cpuid
+  shr     ebx, 16
+  and     ebx, 0000000FFh
+  cmp     bl, 1
+  jae     PushProcessorCount
+
+  ;
+  ; Some processors report 0 logical processors.  Effectively 0 = 1.
+  ; So we fix up the processor count
+  ;
+  inc     ebx
+
+PushProcessorCount:
+  sub     rsp, 4
+  mov     rdi, rsp
+  mov     DWORD [rdi], ebx
+
+  ;
+  ; We need to implement a long-term solution for BIST capture.  For now, we just copy BSP BIST
+  ; for all processor threads
+  ;
+  xor     ecx, ecx
+  mov     cl, bl
+PushBist:
+  sub     rsp, 4
+  mov     rdi, rsp
+  movd    eax, mm0
+  mov     DWORD [rdi], eax
+  loop    PushBist
+
+  ;
+  ; FSP saves the timestamp of the beginning of firmware execution in mm5.
+  ; Get the timestamp from mm5 and then push to stack.
+  ;
+  movq    rax, mm5
+  push    rax
+
+  ;
+  ; Per X64 calling convention, make sure RSP is 16-byte aligned.
+  ;
+  mov     rax, rsp
+  and     rax, 0fh
+  sub     rsp, rax
+
+  ;
+  ; Pass entry point of the PEI core
+  ;
+  mov     rdi, 0FFFFFFE0h
+  mov     edi, DWORD [rdi]
+  mov     r9, rdi
+
+  ;
+  ; Pass BFV into the PEI Core
+  ;
+  ; Reset Vector and initial SEC core (to initialize Temp Ram) is part of FSP-O.
+  ; Default UefiCpuPkg Reset Vector locates FSP-O as BFV. However the actual
+  ; SEC core that launches PEI is part of another FV. We need to pass that FV
+  ; as BFV to PEI core.
+  ;
+  mov     r8, ASM_PFX (PcdGet64 (PcdFspWrapperBfvforResetVectorInFsp))
+  mov     rcx, QWORD[r8]
+  mov     r8,  rcx
+
+  ;
+  ; Pass stack size into the PEI Core
+  ;
+  mov     rcx, r15  ; Start of TempRam
+  mov     rdx, r14  ; End of TempRam
+
+  sub     rcx, rdx  ; Size of TempRam
+
+  ;
+  ; Pass Control into the PEI Core
+  ;
+  sub     rsp, 20h
+  call    ASM_PFX(SecStartup)
+
diff --git a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/X64/SecEntry.nasm b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/X64/SecEntry.nasm
new file mode 100644
index 0000000000..de8ba83d52
--- /dev/null
+++ b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/X64/SecEntry.nasm
@@ -0,0 +1,71 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>
+; SPDX-License-Identifier: BSD-2-Clause-Patent
+; Module Name:
+;
+;  SecEntry.nasm
+;
+; Abstract:
+;
+;  This is the code that passes control to PEI core.
+;
+;------------------------------------------------------------------------------
+
+#include <Fsp.h>
+
+SECTION .text
+
+extern   ASM_PFX(CallPeiCoreEntryPoint)
+extern   ASM_PFX(FsptUpdDataPtr)
+; Pcds
+extern   ASM_PFX(PcdGet32 (PcdFspTemporaryRamSize))
+
+;----------------------------------------------------------------------------
+;
+; Procedure:    _ModuleEntryPoint
+;
+; Input:        None
+;
+; Output:       None
+;
+; Destroys:     Assume all registers
+;
+; Description:
+;
+;  After TempRamInit done, pass control to PEI core.
+;
+; Return:       None
+;
+;  MMX Usage:
+;              MM0 = BIST State
+;
+;----------------------------------------------------------------------------
+
+BITS 64
+align 16
+global ASM_PFX(_ModuleEntryPoint)
+ASM_PFX(_ModuleEntryPoint):
+  push    rax
+  mov     rax, ASM_PFX(FsptUpdDataPtr)  ; This is dummy code to include TempRamInitParams in SecCore for FSP-O.
+#if FixedPcdGet8(PcdFspModeSelection) == 1
+  mov     rax, ASM_PFX(PcdGet32 (PcdFspTemporaryRamSize))
+  sub     edx, dword [rax]              ; TemporaryRam for FSP
+#endif
+  pop     rax
+
+  mov     r8,  rdx
+  mov     rdx, rcx
+  xor     ecx, ecx                      ; zero - no Hob List Yet
+  mov     rsp, r8
+
+  ;
+  ; Per X64 calling convention, make sure RSP is 16-byte aligned.
+  ;
+  mov     rax, rsp
+  and     rax, 0fh
+  sub     rsp, rax
+
+  call    ASM_PFX(CallPeiCoreEntryPoint)
+
+  jmp     $
diff --git a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/X64/Stack.nasm b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/X64/Stack.nasm
new file mode 100644
index 0000000000..21010bf4ef
--- /dev/null
+++ b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/X64/Stack.nasm
@@ -0,0 +1,72 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>
+; SPDX-License-Identifier: BSD-2-Clause-Patent
+; Abstract:
+;
+;   Switch the stack from temporary memory to permanent memory.
+;
+;------------------------------------------------------------------------------
+
+    SECTION .text
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; SecSwitchStack (
+;   UINT32   TemporaryMemoryBase,
+;   UINT32   PermanentMemoryBase
+;   );
+;------------------------------------------------------------------------------
+global ASM_PFX(SecSwitchStack)
+ASM_PFX(SecSwitchStack):
+    ;
+    ; Save four register: rax, rbx, rcx, rdx
+    ;
+    push  rax
+    push  rbx
+    push  rcx
+    push  rdx
+
+    ;
+    ; !!CAUTION!! this function address's is pushed into stack after
+    ; migration of whole temporary memory, so need save it to permanent
+    ; memory at first!
+    ;
+
+    mov   rbx, rcx                 ; Save the first parameter
+    mov   rcx, rdx                 ; Save the second parameter
+
+    ;
+    ; Save this function's return address into permanent memory at first.
+    ; Then, Fixup the esp point to permanent memory
+    ;
+    mov   rax, rsp
+    sub   rax, rbx
+    add   rax, rcx
+    mov   rdx, qword [rsp]         ; copy pushed register's value to permanent memory
+    mov   qword [rax], rdx
+    mov   rdx, qword [rsp + 8]
+    mov   qword [rax + 8], rdx
+    mov   rdx, qword [rsp + 16]
+    mov   qword [rax + 16], rdx
+    mov   rdx, qword [rsp + 24]
+    mov   qword [rax + 24], rdx
+    mov   rdx, qword [rsp + 32]    ; Update this function's return address into permanent memory
+    mov   qword [rax + 32], rdx
+    mov   rsp, rax                 ; From now, rsp is pointed to permanent memory
+
+    ;
+    ; Fixup the rbp point to permanent memory
+    ;
+    mov   rax, rbp
+    sub   rax, rbx
+    add   rax, rcx
+    mov   rbp, rax                 ; From now, rbp is pointed to permanent memory
+
+    pop   rdx
+    pop   rcx
+    pop   rbx
+    pop   rax
+    ret
+
diff --git a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/Ia32/Fsp.h b/Platform/Intel/MinPlatformPkg/Include/Fsp.h
similarity index 79%
rename from Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/Ia32/Fsp.h
rename to Platform/Intel/MinPlatformPkg/Include/Fsp.h
index 9f6cdcf476..319e1e3372 100644
--- a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/Ia32/Fsp.h
+++ b/Platform/Intel/MinPlatformPkg/Include/Fsp.h
@@ -1,7 +1,7 @@
 /** @file
   Fsp related definitions
 
-Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2017 - 2024, Intel Corporation. All rights reserved.<BR>
 SPDX-License-Identifier: BSD-2-Clause-Patent
 
 **/
@@ -36,7 +36,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 //
 // Fsp Header
 //
-#define FSP_HEADER_IMAGEBASE_OFFSET     0x1C
-#define FSP_HEADER_TEMPRAMINIT_OFFSET   0x30
+#define FSP_HEADER_IMAGEBASE_OFFSET   0x1C
+#define FSP_HEADER_TEMPRAMINIT_OFFSET 0x30
 
 #endif
diff --git a/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dec b/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dec
index a14c6b2db5..12f86585ad 100644
--- a/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dec
+++ b/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dec
@@ -6,7 +6,7 @@
 # INF files to generate AutoGen.c and AutoGen.h files
 # for the build infrastructure.
 #
-# Copyright (c) 2017 - 2021, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2017 - 2024, Intel Corporation. All rights reserved.<BR>
 # Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR>
 #
 # SPDX-License-Identifier: BSD-2-Clause-Patent
@@ -393,6 +393,21 @@
   #
   gMinPlatformPkgTokenSpaceGuid.PcdFspDispatchModeUseFspPeiMain|TRUE|BOOLEAN|0xF00000A8
 
+  ## BFV Location for Reset Vector in FSP
+  # The default of BFV Location for Reset Vector in FSP is 0x00000000FFFF0000.
+  #
+  gMinPlatformPkgTokenSpaceGuid.PcdFspWrapperBfvforResetVectorInFsp|0x00000000FFFF0000|UINT64|0xF00000A9
+
+  ## FSP-T UPD Header Revision
+  # The default of FSP-T UPD Header Revision is 0.
+  #
+  gMinPlatformPkgTokenSpaceGuid.PcdFsptUpdHeaderRevision|0x0|UINT8|0xF00000AA
+
+  ## FSP-T ARCH UPD Revision
+  # The default of FSP-T ARCH UPD Revision is 0.
+  #
+  gMinPlatformPkgTokenSpaceGuid.PcdFsptArchUpdRevision|0x0|UINT8|0xF00000AC
+
 [PcdsFeatureFlag]
 
   gMinPlatformPkgTokenSpaceGuid.PcdStopAfterDebugInit     |FALSE|BOOLEAN|0xF00000A1
-- 
2.40.1.windows.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#113032): https://edk2.groups.io/g/devel/message/113032
Mute This Topic: https://groups.io/mt/103478590/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [edk2-devel][edk2-platforms][PATCH v4] MinPlatformPkg: Support SecFspWrapperPlatformSecLib in X64
  2024-01-02  9:40 [edk2-devel][edk2-platforms][PATCH v4] MinPlatformPkg: Support SecFspWrapperPlatformSecLib in X64 Kuo, Ted
@ 2024-01-26  0:19 ` Chaganty, Rangasai V
  2024-01-29 23:39 ` Nate DeSimone
  1 sibling, 0 replies; 4+ messages in thread
From: Chaganty, Rangasai V @ 2024-01-26  0:19 UTC (permalink / raw)
  To: Kuo, Ted, devel@edk2.groups.io
  Cc: Chiu, Chasel, Desimone, Nathaniel L, Dong, Eric, S, Ashraf Ali,
	Duggapu, Chinni B, Gao, Liming

Looks good to me. Please get RB by atleast one of the Pkg maintainers. 
With that:
Reviewed-by: Sai Chaganty <rangasai.v.chaganty@intel.com>

-----Original Message-----
From: Kuo, Ted <ted.kuo@intel.com> 
Sent: Tuesday, January 2, 2024 1:41 AM
To: devel@edk2.groups.io
Cc: Chaganty, Rangasai V <rangasai.v.chaganty@intel.com>; Chiu, Chasel <chasel.chiu@intel.com>; Desimone, Nathaniel L <nathaniel.l.desimone@intel.com>; Dong, Eric <eric.dong@intel.com>; S, Ashraf Ali <ashraf.ali.s@intel.com>; Duggapu, Chinni B <chinni.b.duggapu@intel.com>; Gao, Liming <gaoliming@byosoft.com.cn>
Subject: [edk2-devel][edk2-platforms][PATCH v4] MinPlatformPkg: Support SecFspWrapperPlatformSecLib in X64

https://bugzilla.tianocore.org/show_bug.cgi?id=4623
1.Added PeiCoreEntry.nasm, SecEntry.nasm and Stack.nasm for X64.
2.Made changes in common files to support both IA32 and X64.
3.Added the PCDs below for FSP-T UPD revisions and reset vector in FSP.
 - PcdFspWrapperBfvforResetVectorInFsp
 - PcdFsptUpdHeaderRevision
 - PcdFsptArchUpdRevision

Cc: Sai Chaganty <rangasai.v.chaganty@intel.com>
Cc: Chasel Chiu <chasel.chiu@intel.com>
Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>
Cc: Eric Dong <eric.dong@intel.com>
Cc: Ashraf Ali S <ashraf.ali.s@intel.com>
Cc: Chinni B Duggapu <chinni.b.duggapu@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Signed-off-by: Ted Kuo <ted.kuo@intel.com>
---
 .../SecFspWrapperPlatformSecLib/FsptCoreUpd.h |  25 ++-
 .../Ia32/SecEntry.nasm                        |   4 +-
 .../SecFspWrapperPlatformSecLib.inf           |   9 +-
 ...pWrapperPlatformSecLibResetVectorInFsp.inf | 101 +++++++++
 .../SecGetPerformance.c                       |  11 +-
 .../SecPlatformInformation.c                  |   8 +-
 .../SecRamInitData.c                          |  73 +++++--
 .../X64/PeiCoreEntry.nasm                     | 202 ++++++++++++++++++
 .../X64/SecEntry.nasm                         |  71 ++++++
 .../X64/Stack.nasm                            |  72 +++++++
 .../Ia32 => Include}/Fsp.h                    |   6 +-
 .../Intel/MinPlatformPkg/MinPlatformPkg.dec   |  17 +-
 12 files changed, 565 insertions(+), 34 deletions(-)  create mode 100644 Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecFspWrapperPlatformSecLibResetVectorInFsp.inf
 create mode 100644 Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/X64/PeiCoreEntry.nasm
 create mode 100644 Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/X64/SecEntry.nasm
 create mode 100644 Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/X64/Stack.nasm
 rename Platform/Intel/MinPlatformPkg/{FspWrapper/Library/SecFspWrapperPlatformSecLib/Ia32 => Include}/Fsp.h (79%)

diff --git a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/FsptCoreUpd.h b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/FsptCoreUpd.h
index 7c0f605b92..24c18f25b8 100644
--- a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/FsptCoreUpd.h
+++ b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlat
+++ formSecLib/FsptCoreUpd.h
@@ -1,6 +1,6 @@
 /** @file -Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>+Copyright (c) 2017 - 2024, Intel Corporation. All rights reserved.<BR> SPDX-License-Identifier: BSD-2-Clause-Patent  **/@@ -10,6 +10,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
  #pragma pack(1) +#if FixedPcdGet8 (PcdFsptArchUpdRevision) <= 1 /** Fsp T Core UPD **/ typedef struct {@@ -34,6 +35,28 @@ typedef struct {
 **/   UINT8                       Reserved[16]; } FSPT_CORE_UPD;+#else+/** Fsp T Core UPD+**/+typedef struct {++/** Offset 0x0040+**/+  EFI_PHYSICAL_ADDRESS        MicrocodeRegionBase;++/** Offset 0x0048+**/+  UINT64                      MicrocodeRegionSize;++/** Offset 0x0050+**/+  EFI_PHYSICAL_ADDRESS        CodeRegionBase;++/** Offset 0x0058+**/+  UINT64                      CodeRegionSize;+} FSPT_CORE_UPD;+#endif  #pragma pack() diff --git a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/Ia32/SecEntry.nasm b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/Ia32/SecEntry.nasm
index 7f6d771e41..0b3f343991 100644
--- a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/Ia32/SecEntry.nasm
+++ b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlat
+++ formSecLib/Ia32/SecEntry.nasm
@@ -1,6 +1,6 @@
 ;------------------------------------------------------------------------------ ;-; Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>+; Copyright (c) 2019 - 2024, Intel Corporation. All rights reserved.<BR> ; SPDX-License-Identifier: BSD-2-Clause-Patent ; Module Name: ;@@ -13,7 +13,7 @@  ; ;------------------------------------------------------------------------------ -#include "Fsp.h"+#include <Fsp.h>  SECTION .text diff --git a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecFspWrapperPlatformSecLib.inf b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecFspWrapperPlatformSecLib.inf
index 2e0d67eae4..6806e000ce 100644
--- a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecFspWrapperPlatformSecLib.inf
+++ b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlat
+++ formSecLib/SecFspWrapperPlatformSecLib.inf
@@ -1,7 +1,7 @@
 ## @file-#  Provide FSP wrapper platform sec related function.+#  Provide FSP wrapper platform sec related function for IA32. #-#  Copyright (c) 2017 - 2021, Intel Corporation. All rights reserved.<BR>+#  Copyright (c) 2017 - 2024, Intel Corporation. All rights reserved.<BR> # # SPDX-License-Identifier: BSD-2-Clause-Patent #@@ -25,7 +25,7 @@
 # # The following information is for reference only and not required by the build tools. #-#  VALID_ARCHITECTURES           = IA32 X64+#  VALID_ARCHITECTURES           = IA32 #  ################################################################################@@ -47,7 +47,6 @@
   Ia32/SecEntry.nasm   Ia32/PeiCoreEntry.nasm   Ia32/Stack.nasm-  Ia32/Fsp.h  ################################################################################ #@@ -96,3 +95,5 @@
   gIntelFsp2WrapperTokenSpaceGuid.PcdFspmBaseAddress                  ## CONSUMES   gIntelFsp2WrapperTokenSpaceGuid.PcdFspModeSelection                 ## CONSUMES   gMinPlatformPkgTokenSpaceGuid.PcdFspDispatchModeUseFspPeiMain       ## CONSUMES+  gMinPlatformPkgTokenSpaceGuid.PcdFsptUpdHeaderRevision              ## CONSUMES+  gMinPlatformPkgTokenSpaceGuid.PcdFsptArchUpdRevision                ## CONSUMESdiff --git a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecFspWrapperPlatformSecLibResetVectorInFsp.inf b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecFspWrapperPlatformSecLibResetVectorInFsp.inf
new file mode 100644
index 0000000000..ea062cfad1
--- /dev/null
+++ b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlat
+++ formSecLib/SecFspWrapperPlatformSecLibResetVectorInFsp.inf
@@ -0,0 +1,101 @@
+## @file+#  Provide FSP wrapper platform sec related function for X64.+#+#  Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>+#+# SPDX-License-Identifier: BSD-2-Clause-Patent+#+#+##++################################################################################+#+# Defines Section - statements that will be processed to create a Makefile.+#+################################################################################+[Defines]+  INF_VERSION                    = 0x00010005+  BASE_NAME                      = SecFspWrapperPlatformSecLib+  FILE_GUID                      = 94D8AA5C-5BAE-421F-B2C7-DD1A93BB4D3D+  MODULE_TYPE                    = SEC+  VERSION_STRING                 = 1.0+  LIBRARY_CLASS                  = PlatformSecLib+++#+# The following information is for reference only and not required by the build tools.+# This library is only supported in X64 when reset vector is in FSP.+#+#  VALID_ARCHITECTURES           = X64+#++################################################################################+#+# Sources Section - list of files that are required for the build to succeed.+#+################################################################################++[Sources]+  FspWrapperPlatformSecLib.c+  SecRamInitData.c+  SecPlatformInformation.c+  SecGetPerformance.c+  SecTempRamDone.c+  PlatformInit.c+  FsptCoreUpd.h++[Sources.X64]+  X64/SecEntry.nasm+  X64/PeiCoreEntry.nasm+  X64/Stack.nasm++################################################################################+#+# Package Dependency Section - list of Package files that are required for+#                              this module.+#+################################################################################++[Packages]+  MdePkg/MdePkg.dec+  MdeModulePkg/MdeModulePkg.dec+  UefiCpuPkg/UefiCpuPkg.dec+  IntelFsp2Pkg/IntelFsp2Pkg.dec+  IntelFsp2WrapperPkg/IntelFsp2WrapperPkg.dec+  MinPlatformPkg/MinPlatformPkg.dec++[LibraryClasses]+  LocalApicLib+  SerialPortLib+  FspWrapperPlatformLib+  FspWrapperApiLib+  SecBoardInitLib+  TestPointCheckLib+  PeiServicesTablePointerLib++[Ppis]+  gEfiSecPlatformInformationPpiGuid       ## CONSUMES+  gPeiSecPerformancePpiGuid               ## CONSUMES+  gTopOfTemporaryRamPpiGuid               ## PRODUCES+  gEfiPeiFirmwareVolumeInfoPpiGuid        ## PRODUCES+  gFspTempRamExitPpiGuid                  ## CONSUMES+  gPlatformInitTempRamExitPpiGuid         ## CONSUMES++[Pcd]+  gUefiCpuPkgTokenSpaceGuid.PcdPeiTemporaryRamStackSize               ## CONSUMES+  gIntelFsp2WrapperTokenSpaceGuid.PcdFsptBaseAddress                  ## CONSUMES+  gIntelFsp2PkgTokenSpaceGuid.PcdFspTemporaryRamSize                  ## CONSUMES+  gMinPlatformPkgTokenSpaceGuid.PcdSecSerialPortDebugEnable           ## CONSUMES++[FixedPcd]+  gMinPlatformPkgTokenSpaceGuid.PcdFlashFvMicrocodeBase               ## CONSUMES+  gMinPlatformPkgTokenSpaceGuid.PcdFlashFvMicrocodeSize               ## CONSUMES+  gMinPlatformPkgTokenSpaceGuid.PcdMicrocodeOffsetInFv                ## CONSUMES+  gIntelFsp2WrapperTokenSpaceGuid.PcdFlashCodeCacheAddress            ## CONSUMES+  gIntelFsp2WrapperTokenSpaceGuid.PcdFlashCodeCacheSize               ## CONSUMES+  gIntelFsp2WrapperTokenSpaceGuid.PcdFspmBaseAddress                  ## CONSUMES+  gIntelFsp2WrapperTokenSpaceGuid.PcdFspModeSelection                 ## CONSUMES+  gMinPlatformPkgTokenSpaceGuid.PcdFspDispatchModeUseFspPeiMain       ## CONSUMES+  gMinPlatformPkgTokenSpaceGuid.PcdFspWrapperBfvforResetVectorInFsp   ## CONSUMES+  gMinPlatformPkgTokenSpaceGuid.PcdFsptUpdHeaderRevision              ## CONSUMES+  gMinPlatformPkgTokenSpaceGuid.PcdFsptArchUpdRevision                ## CONSUMESdiff --git a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecGetPerformance.c b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecGetPerformance.c
index ac2deeabec..1699bd9710 100644
--- a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecGetPerformance.c
+++ b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlat
+++ formSecLib/SecGetPerformance.c
@@ -1,7 +1,7 @@
 /** @file   Sample to provide SecGetPerformance function. -Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.<BR>+Copyright (c) 2017 - 2024, Intel Corporation. All rights reserved.<BR> SPDX-License-Identifier: BSD-2-Clause-Patent  **/@@ -58,6 +58,7 @@ SecGetPerformance (
   if (EFI_ERROR (Status)) {     return EFI_NOT_FOUND;   }+   //   // |--------------| <- TopOfTemporaryRam - BL   // |   List Ptr   |@@ -77,12 +78,12 @@ SecGetPerformance (
   // |  TSC[31:00]  |   // |--------------|   //-  TopOfTemporaryRam = (UINTN) TopOfTemporaryRamPpi - sizeof (UINT32);-  TopOfTemporaryRam -= sizeof (UINT32) * 2;-  Count             = *(UINT32 *)(TopOfTemporaryRam - sizeof (UINT32));+  TopOfTemporaryRam = (UINTN) TopOfTemporaryRamPpi - sizeof (UINTN);+  TopOfTemporaryRam -= sizeof(UINTN) * 2;+  Count             = *(UINT32 *) (UINTN) (TopOfTemporaryRam - sizeof (UINT32));   Size              = Count * sizeof (UINT32); -  Ticker = *(UINT64 *) (TopOfTemporaryRam - sizeof (UINT32) - Size - sizeof (UINT32) * 2);+  Ticker = *(UINT64 *) (UINTN) (TopOfTemporaryRam - sizeof (UINT32) - Size - sizeof (UINT64));   Performance->ResetEnd = GetTimeInNanoSecond (Ticker);    return EFI_SUCCESS;diff --git a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecPlatformInformation.c b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecPlatformInformation.c
index 24d55ed838..4cbde95c2d 100644
--- a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecPlatformInformation.c
+++ b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlat
+++ formSecLib/SecPlatformInformation.c
@@ -1,7 +1,7 @@
 /** @file   Provide SecPlatformInformation function. -Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.<BR>+Copyright (c) 2017 - 2024, Intel Corporation. All rights reserved.<BR> SPDX-License-Identifier: BSD-2-Clause-Patent  **/@@ -59,9 +59,9 @@ SecPlatformInformation (
   // This routine copies the BIST information to the buffer pointed by   // PlatformInformationRecord for output.   //-  TopOfTemporaryRam = (UINTN) TopOfTemporaryRamPpi - sizeof (UINT32);-  TopOfTemporaryRam -= sizeof (UINT32) * 2;-  Count             = *((UINT32 *)(TopOfTemporaryRam - sizeof (UINT32)));+  TopOfTemporaryRam = (UINTN) TopOfTemporaryRamPpi - sizeof (UINTN);+  TopOfTemporaryRam -= sizeof (UINTN) * 2;+  Count             = *((UINT32 *)(UINTN) (TopOfTemporaryRam - sizeof (UINT32)));   Size              = Count * sizeof (IA32_HANDOFF_STATUS);    if ((*StructureSize) < (UINT64) Size) {diff --git a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecRamInitData.c b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecRamInitData.c
index 355d1e6509..49d5302a7b 100644
--- a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecRamInitData.c
+++ b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlat
+++ formSecLib/SecRamInitData.c
@@ -1,7 +1,7 @@
 /** @file   Provide TempRamInitParams data. -Copyright (c) 2017 - 2021, Intel Corporation. All rights reserved.<BR>+Copyright (c) 2017 - 2024, Intel Corporation. All rights reserved.<BR> SPDX-License-Identifier: BSD-2-Clause-Patent  **/@@ -12,25 +12,70 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
  typedef struct {   FSP_UPD_HEADER    FspUpdHeader;+#if FixedPcdGet8 (PcdFsptArchUpdRevision) == 1+  FSPT_ARCH_UPD     FsptArchUpd;+#elif FixedPcdGet8 (PcdFsptArchUpdRevision) == 2+  FSPT_ARCH2_UPD    FsptArchUpd;+#endif   FSPT_CORE_UPD     FsptCoreUpd;-} FSPT_UPD_CORE_DATA;+  UINT16            UpdTerminator;+} FSPT_UPD_DATA; -GLOBAL_REMOVE_IF_UNREFERENCED CONST FSPT_UPD_CORE_DATA FsptUpdDataPtr = {+GLOBAL_REMOVE_IF_UNREFERENCED CONST FSPT_UPD_DATA FsptUpdDataPtr = {   {-    0x4450555F54505346,-    0x00,-    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00+    0x4450555F54505346,                                           // FSP-T UPD Header Signature - FSPT_UPD+    FixedPcdGet8 (PcdFsptUpdHeaderRevision),                      // FSP-T UPD Header Revision+    {                                                             // Reserved[23]+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,+      0x00, 0x00, 0x00     }   },+#if FixedPcdGet8 (PcdFsptArchUpdRevision) == 1   {-    FixedPcdGet32 (PcdFlashFvMicrocodeBase) + FixedPcdGet32 (PcdMicrocodeOffsetInFv),-    FixedPcdGet32 (PcdFlashFvMicrocodeSize) - FixedPcdGet32 (PcdMicrocodeOffsetInFv),-    0,          // Set CodeRegionBase as 0, so that caching will be 4GB-(CodeRegionSize > LLCSize ? LLCSize : CodeRegionSize) will be used.-    FixedPcdGet32 (PcdFlashCodeCacheSize),-    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,+    0x01,                                                         // FSP-T ARCH UPD Revision+    {                                                             // Reserved[3]+      0x00, 0x00, 0x00+    },+    0x00000020,                                                   // Length of FSP-T ARCH UPD+    0,                                                            // FspDebugHandler+    {                                                             // Reserved1[20]+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00+    }+  },+#elif FixedPcdGet8 (PcdFsptArchUpdRevision) == 2+  {+    0x02,                                                         // FSP-T ARCH2 UPD Revision+    {                                                             // Reserved[3]+      0x00, 0x00, 0x00+    },+    0x00000020,                                                   // Length of FSP-T ARCH2 UPD+    0,                                                            // FspDebugHandler+    {                                                             // Reserved1[16]+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,       0x00, 0x00, 0x00, 0x00, 0x00, 0x00     }-  }+  },+#endif+#if FixedPcdGet8 (PcdFsptArchUpdRevision) <= 1+  {+    FixedPcdGet32 (PcdFlashFvMicrocodeBase) + FixedPcdGet32 (PcdMicrocodeOffsetInFv), // MicrocodeRegionBase+    FixedPcdGet32 (PcdFlashFvMicrocodeSize) - FixedPcdGet32 (PcdMicrocodeOffsetInFv), // MicrocodeRegionSize+    0, // Set CodeRegionBase as 0, so that caching will be 4GB-(CodeRegionSize > LLCSize ? LLCSize : CodeRegionSize) will be used.+    FixedPcdGet32 (PcdFlashCodeCacheSize),                                            // CodeRegionSize+    {                                                                                 // Reserved[16]+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00+    }+  },+#else+  {+    FixedPcdGet32 (PcdFlashFvMicrocodeBase) + FixedPcdGet32 (PcdMicrocodeOffsetInFv), // MicrocodeRegionBase+    FixedPcdGet32 (PcdFlashFvMicrocodeSize) - FixedPcdGet32 (PcdMicrocodeOffsetInFv), // MicrocodeRegionSize+    0, // Set CodeRegionBase as 0, so that caching will be 4GB-(CodeRegionSize > LLCSize ? LLCSize : CodeRegionSize) will be used.+    FixedPcdGet32 (PcdFlashCodeCacheSize)                                             // CodeRegionSize+  },+#endif+  0x55AA };-diff --git a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/X64/PeiCoreEntry.nasm b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/X64/PeiCoreEntry.nasm
new file mode 100644
index 0000000000..af3affcf7f
--- /dev/null
+++ b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlat
+++ formSecLib/X64/PeiCoreEntry.nasm
@@ -0,0 +1,202 @@
+;------------------------------------------------------------------------------+;+; Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>+; SPDX-License-Identifier: BSD-2-Clause-Patent+;+; Module Name:+;+;  PeiCoreEntry.nasm+;+; Abstract:+;+;   Find and call SecStartup+;+;------------------------------------------------------------------------------++SECTION .text++extern ASM_PFX(SecStartup)+extern ASM_PFX(PlatformInit)+extern ASM_PFX(PcdGet64 (PcdFspWrapperBfvforResetVectorInFsp))++;-----------------------------------------------------------------------------+;  Macro:        PUSHA_64+;+;  Description:  Saves all registers on stack+;+;  Input:        None+;+;  Output:       None+;-----------------------------------------------------------------------------+%macro PUSHA_64   0+  push    r8+  push    r9+  push    r10+  push    r11+  push    r12+  push    r13+  push    r14+  push    r15+  push    rax+  push    rcx+  push    rdx+  push    rbx+  push    rsp+  push    rbp+  push    rsi+  push    rdi+%endmacro++;-----------------------------------------------------------------------------+;  Macro:        POPA_64+;+;  Description:  Restores all registers from stack+;+;  Input:        None+;+;  Output:       None+;-----------------------------------------------------------------------------+%macro POPA_64   0+  pop    rdi+  pop    rsi+  pop    rbp+  pop    rsp+  pop    rbx+  pop    rdx+  pop    rcx+  pop    rax+  pop    r15+  pop    r14+  pop    r13+  pop    r12+  pop    r11+  pop    r10+  pop    r9+  pop    r8+%endmacro++global ASM_PFX(CallPeiCoreEntryPoint)+ASM_PFX(CallPeiCoreEntryPoint):+  ;+  ; Per X64 calling convention, make sure RSP is 16-byte aligned.+  ;+  mov     rax, rsp+  and     rax, 0fh+  sub     rsp, rax++  ;+  ; Platform init+  ;+  PUSHA_64+  sub     rsp, 20h+  call    ASM_PFX(PlatformInit)+  add     rsp, 20h+  POPA_64++  ;+  ; Set stack top pointer+  ;+  mov     rsp, r8++  ;+  ; Push the hob list pointer+  ;+  push    rcx++  ;+  ; RBP holds start of BFV passed from Vtf0. Save it to r10.+  ;+  mov     r10, rbp++  ;+  ; Save the value+  ;   RDX: start of range+  ;   r8: end of range+  ;+  mov     rbp, rsp+  push    rdx+  push    r8+  mov     r14, rdx+  mov     r15, r8++  ;+  ; Push processor count to stack first, then BIST status (AP then BSP)+  ;+  mov     eax, 1+  cpuid+  shr     ebx, 16+  and     ebx, 0000000FFh+  cmp     bl, 1+  jae     PushProcessorCount++  ;+  ; Some processors report 0 logical processors.  Effectively 0 = 1.+  ; So we fix up the processor count+  ;+  inc     ebx++PushProcessorCount:+  sub     rsp, 4+  mov     rdi, rsp+  mov     DWORD [rdi], ebx++  ;+  ; We need to implement a long-term solution for BIST capture.  For now, we just copy BSP BIST+  ; for all processor threads+  ;+  xor     ecx, ecx+  mov     cl, bl+PushBist:+  sub     rsp, 4+  mov     rdi, rsp+  movd    eax, mm0+  mov     DWORD [rdi], eax+  loop    PushBist++  ;+  ; FSP saves the timestamp of the beginning of firmware execution in mm5.+  ; Get the timestamp from mm5 and then push to stack.+  ;+  movq    rax, mm5+  push    rax++  ;+  ; Per X64 calling convention, make sure RSP is 16-byte aligned.+  ;+  mov     rax, rsp+  and     rax, 0fh+  sub     rsp, rax++  ;+  ; Pass entry point of the PEI core+  ;+  mov     rdi, 0FFFFFFE0h+  mov     edi, DWORD [rdi]+  mov     r9, rdi++  ;+  ; Pass BFV into the PEI Core+  ;+  ; Reset Vector and initial SEC core (to initialize Temp Ram) is part of FSP-O.+  ; Default UefiCpuPkg Reset Vector locates FSP-O as BFV. However the actual+  ; SEC core that launches PEI is part of another FV. We need to pass that FV+  ; as BFV to PEI core.+  ;+  mov     r8, ASM_PFX (PcdGet64 (PcdFspWrapperBfvforResetVectorInFsp))+  mov     rcx, QWORD[r8]+  mov     r8,  rcx++  ;+  ; Pass stack size into the PEI Core+  ;+  mov     rcx, r15  ; Start of TempRam+  mov     rdx, r14  ; End of TempRam++  sub     rcx, rdx  ; Size of TempRam++  ;+  ; Pass Control into the PEI Core+  ;+  sub     rsp, 20h+  call    ASM_PFX(SecStartup)+diff --git a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/X64/SecEntry.nasm b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/X64/SecEntry.nasm
new file mode 100644
index 0000000000..de8ba83d52
--- /dev/null
+++ b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlat
+++ formSecLib/X64/SecEntry.nasm
@@ -0,0 +1,71 @@
+;------------------------------------------------------------------------------+;+; Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>+; SPDX-License-Identifier: BSD-2-Clause-Patent+; Module Name:+;+;  SecEntry.nasm+;+; Abstract:+;+;  This is the code that passes control to PEI core.+;+;------------------------------------------------------------------------------++#include <Fsp.h>++SECTION .text++extern   ASM_PFX(CallPeiCoreEntryPoint)+extern   ASM_PFX(FsptUpdDataPtr)+; Pcds+extern   ASM_PFX(PcdGet32 (PcdFspTemporaryRamSize))++;----------------------------------------------------------------------------+;+; Procedure:    _ModuleEntryPoint+;+; Input:        None+;+; Output:       None+;+; Destroys:     Assume all registers+;+; Description:+;+;  After TempRamInit done, pass control to PEI core.+;+; Return:       None+;+;  MMX Usage:+;              MM0 = BIST State+;+;----------------------------------------------------------------------------++BITS 64+align 16+global ASM_PFX(_ModuleEntryPoint)+ASM_PFX(_ModuleEntryPoint):+  push    rax+  mov     rax, ASM_PFX(FsptUpdDataPtr)  ; This is dummy code to include TempRamInitParams in SecCore for FSP-O.+#if FixedPcdGet8(PcdFspModeSelection) == 1+  mov     rax, ASM_PFX(PcdGet32 (PcdFspTemporaryRamSize))+  sub     edx, dword [rax]              ; TemporaryRam for FSP+#endif+  pop     rax++  mov     r8,  rdx+  mov     rdx, rcx+  xor     ecx, ecx                      ; zero - no Hob List Yet+  mov     rsp, r8++  ;+  ; Per X64 calling convention, make sure RSP is 16-byte aligned.+  ;+  mov     rax, rsp+  and     rax, 0fh+  sub     rsp, rax++  call    ASM_PFX(CallPeiCoreEntryPoint)++  jmp     $diff --git a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/X64/Stack.nasm b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/X64/Stack.nasm
new file mode 100644
index 0000000000..21010bf4ef
--- /dev/null
+++ b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlat
+++ formSecLib/X64/Stack.nasm
@@ -0,0 +1,72 @@
+;------------------------------------------------------------------------------+;+; Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>+; SPDX-License-Identifier: BSD-2-Clause-Patent+; Abstract:+;+;   Switch the stack from temporary memory to permanent memory.+;+;------------------------------------------------------------------------------++    SECTION .text++;------------------------------------------------------------------------------+; VOID+; EFIAPI+; SecSwitchStack (+;   UINT32   TemporaryMemoryBase,+;   UINT32   PermanentMemoryBase+;   );+;------------------------------------------------------------------------------+global ASM_PFX(SecSwitchStack)+ASM_PFX(SecSwitchStack):+    ;+    ; Save four register: rax, rbx, rcx, rdx+    ;+    push  rax+    push  rbx+    push  rcx+    push  rdx++    ;+    ; !!CAUTION!! this function address's is pushed into stack after+    ; migration of whole temporary memory, so need save it to permanent+    ; memory at first!+    ;++    mov   rbx, rcx                 ; Save the first parameter+    mov   rcx, rdx                 ; Save the second parameter++    ;+    ; Save this function's return address into permanent memory at first.+    ; Then, Fixup the esp point to permanent memory+    ;+    mov   rax, rsp+    sub   rax, rbx+    add   rax, rcx+    mov   rdx, qword [rsp]         ; copy pushed register's value to permanent memory+    mov   qword [rax], rdx+    mov   rdx, qword [rsp + 8]+    mov   qword [rax + 8], rdx+    mov   rdx, qword [rsp + 16]+    mov   qword [rax + 16], rdx+    mov   rdx, qword [rsp + 24]+    mov   qword [rax + 24], rdx+    mov   rdx, qword [rsp + 32]    ; Update this function's return address into permanent memory+    mov   qword [rax + 32], rdx+    mov   rsp, rax                 ; From now, rsp is pointed to permanent memory++    ;+    ; Fixup the rbp point to permanent memory+    ;+    mov   rax, rbp+    sub   rax, rbx+    add   rax, rcx+    mov   rbp, rax                 ; From now, rbp is pointed to permanent memory++    pop   rdx+    pop   rcx+    pop   rbx+    pop   rax+    ret+diff --git a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/Ia32/Fsp.h b/Platform/Intel/MinPlatformPkg/Include/Fsp.h
similarity index 79%
rename from Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/Ia32/Fsp.h
rename to Platform/Intel/MinPlatformPkg/Include/Fsp.h
index 9f6cdcf476..319e1e3372 100644
--- a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/Ia32/Fsp.h
+++ b/Platform/Intel/MinPlatformPkg/Include/Fsp.h
@@ -1,7 +1,7 @@
 /** @file   Fsp related definitions -Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>+Copyright (c) 2017 - 2024, Intel Corporation. All rights reserved.<BR> SPDX-License-Identifier: BSD-2-Clause-Patent  **/@@ -36,7 +36,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 // // Fsp Header //-#define FSP_HEADER_IMAGEBASE_OFFSET     0x1C-#define FSP_HEADER_TEMPRAMINIT_OFFSET   0x30+#define FSP_HEADER_IMAGEBASE_OFFSET   0x1C+#define FSP_HEADER_TEMPRAMINIT_OFFSET 0x30  #endifdiff --git a/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dec b/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dec
index a14c6b2db5..12f86585ad 100644
--- a/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dec
+++ b/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dec
@@ -6,7 +6,7 @@
 # INF files to generate AutoGen.c and AutoGen.h files # for the build infrastructure. #-# Copyright (c) 2017 - 2021, Intel Corporation. All rights reserved.<BR>+# Copyright (c) 2017 - 2024, Intel Corporation. All rights reserved.<BR> # Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR> # # SPDX-License-Identifier: BSD-2-Clause-Patent@@ -393,6 +393,21 @@
   #   gMinPlatformPkgTokenSpaceGuid.PcdFspDispatchModeUseFspPeiMain|TRUE|BOOLEAN|0xF00000A8 +  ## BFV Location for Reset Vector in FSP+  # The default of BFV Location for Reset Vector in FSP is 0x00000000FFFF0000.+  #+  gMinPlatformPkgTokenSpaceGuid.PcdFspWrapperBfvforResetVectorInFsp|0x00000000FFFF0000|UINT64|0xF00000A9++  ## FSP-T UPD Header Revision+  # The default of FSP-T UPD Header Revision is 0.+  #+  gMinPlatformPkgTokenSpaceGuid.PcdFsptUpdHeaderRevision|0x0|UINT8|0xF00000AA++  ## FSP-T ARCH UPD Revision+  # The default of FSP-T ARCH UPD Revision is 0.+  #+  gMinPlatformPkgTokenSpaceGuid.PcdFsptArchUpdRevision|0x0|UINT8|0xF00000AC+ [PcdsFeatureFlag]    gMinPlatformPkgTokenSpaceGuid.PcdStopAfterDebugInit     |FALSE|BOOLEAN|0xF00000A1-- 
2.40.1.windows.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#114480): https://edk2.groups.io/g/devel/message/114480
Mute This Topic: https://groups.io/mt/103478590/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [edk2-devel][edk2-platforms][PATCH v4] MinPlatformPkg: Support SecFspWrapperPlatformSecLib in X64
  2024-01-02  9:40 [edk2-devel][edk2-platforms][PATCH v4] MinPlatformPkg: Support SecFspWrapperPlatformSecLib in X64 Kuo, Ted
  2024-01-26  0:19 ` Chaganty, Rangasai V
@ 2024-01-29 23:39 ` Nate DeSimone
  2024-01-30  7:51   ` Kuo, Ted
  1 sibling, 1 reply; 4+ messages in thread
From: Nate DeSimone @ 2024-01-29 23:39 UTC (permalink / raw)
  To: Kuo, Ted, devel@edk2.groups.io
  Cc: Chaganty, Rangasai V, Chiu, Chasel, Dong, Eric, S, Ashraf Ali,
	Duggapu, Chinni B, Gao, Liming

Hi Ted,

The scenario where we have a 64-bit FSP that does not support reset vector in FSP-O is likely to happen in a future Intel platform. As such, please implement this feature in a manner that does not require all assembly code in the X64 folder to use FSP-O.

Thanks,
Nate

> -----Original Message-----
> From: Kuo, Ted <ted.kuo@intel.com>
> Sent: Tuesday, January 2, 2024 1:41 AM
> To: devel@edk2.groups.io
> Cc: Chaganty, Rangasai V <rangasai.v.chaganty@intel.com>; Chiu, Chasel
> <chasel.chiu@intel.com>; Desimone, Nathaniel L
> <nathaniel.l.desimone@intel.com>; Dong, Eric <eric.dong@intel.com>; S,
> Ashraf Ali <ashraf.ali.s@intel.com>; Duggapu, Chinni B
> <chinni.b.duggapu@intel.com>; Gao, Liming <gaoliming@byosoft.com.cn>
> Subject: [edk2-devel][edk2-platforms][PATCH v4] MinPlatformPkg: Support
> SecFspWrapperPlatformSecLib in X64
> 
> https://bugzilla.tianocore.org/show_bug.cgi?id=4623
> 1.Added PeiCoreEntry.nasm, SecEntry.nasm and Stack.nasm for X64.
> 2.Made changes in common files to support both IA32 and X64.
> 3.Added the PCDs below for FSP-T UPD revisions and reset vector in FSP.
>  - PcdFspWrapperBfvforResetVectorInFsp
>  - PcdFsptUpdHeaderRevision
>  - PcdFsptArchUpdRevision
> 
> Cc: Sai Chaganty <rangasai.v.chaganty@intel.com>
> Cc: Chasel Chiu <chasel.chiu@intel.com>
> Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>
> Cc: Eric Dong <eric.dong@intel.com>
> Cc: Ashraf Ali S <ashraf.ali.s@intel.com>
> Cc: Chinni B Duggapu <chinni.b.duggapu@intel.com>
> Cc: Liming Gao <gaoliming@byosoft.com.cn>
> Signed-off-by: Ted Kuo <ted.kuo@intel.com>
> ---
>  .../SecFspWrapperPlatformSecLib/FsptCoreUpd.h |  25 ++-
>  .../Ia32/SecEntry.nasm                        |   4 +-
>  .../SecFspWrapperPlatformSecLib.inf           |   9 +-
>  ...pWrapperPlatformSecLibResetVectorInFsp.inf | 101 +++++++++
>  .../SecGetPerformance.c                       |  11 +-
>  .../SecPlatformInformation.c                  |   8 +-
>  .../SecRamInitData.c                          |  73 +++++--
>  .../X64/PeiCoreEntry.nasm                     | 202 ++++++++++++++++++
>  .../X64/SecEntry.nasm                         |  71 ++++++
>  .../X64/Stack.nasm                            |  72 +++++++
>  .../Ia32 => Include}/Fsp.h                    |   6 +-
>  .../Intel/MinPlatformPkg/MinPlatformPkg.dec   |  17 +-
>  12 files changed, 565 insertions(+), 34 deletions(-)  create mode 100644
> Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatform
> SecLib/SecFspWrapperPlatformSecLibResetVectorInFsp.inf
>  create mode 100644
> Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatform
> SecLib/X64/PeiCoreEntry.nasm
>  create mode 100644
> Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatform
> SecLib/X64/SecEntry.nasm
>  create mode 100644
> Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatform
> SecLib/X64/Stack.nasm
>  rename
> Platform/Intel/MinPlatformPkg/{FspWrapper/Library/SecFspWrapperPlatfor
> mSecLib/Ia32 => Include}/Fsp.h (79%)
> 
> diff --git
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfor
> mSecLib/FsptCoreUpd.h
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> rmSecLib/FsptCoreUpd.h
> index 7c0f605b92..24c18f25b8 100644
> ---
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfor
> mSecLib/FsptCoreUpd.h
> +++
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlat
> +++ formSecLib/FsptCoreUpd.h
> @@ -1,6 +1,6 @@
>  /** @file -Copyright (c) 2017, Intel Corporation. All rights
> reserved.<BR>+Copyright (c) 2017 - 2024, Intel Corporation. All rights
> reserved.<BR> SPDX-License-Identifier: BSD-2-Clause-Patent  **/@@ -10,6
> +10,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
>   #pragma pack(1) +#if FixedPcdGet8 (PcdFsptArchUpdRevision) <= 1 /** Fsp T
> Core UPD **/ typedef struct {@@ -34,6 +35,28 @@ typedef struct {
>  **/   UINT8                       Reserved[16]; } FSPT_CORE_UPD;+#else+/** Fsp T
> Core UPD+**/+typedef struct {++/** Offset 0x0040+**/+
> EFI_PHYSICAL_ADDRESS        MicrocodeRegionBase;++/** Offset 0x0048+**/+
> UINT64                      MicrocodeRegionSize;++/** Offset 0x0050+**/+
> EFI_PHYSICAL_ADDRESS        CodeRegionBase;++/** Offset 0x0058+**/+
> UINT64                      CodeRegionSize;+} FSPT_CORE_UPD;+#endif  #pragma
> pack() diff --git
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfor
> mSecLib/Ia32/SecEntry.nasm
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> rmSecLib/Ia32/SecEntry.nasm
> index 7f6d771e41..0b3f343991 100644
> ---
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfor
> mSecLib/Ia32/SecEntry.nasm
> +++
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlat
> +++ formSecLib/Ia32/SecEntry.nasm
> @@ -1,6 +1,6 @@
>  ;------------------------------------------------------------------------------ ;-;
> Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>+; Copyright (c)
> 2019 - 2024, Intel Corporation. All rights reserved.<BR> ; SPDX-License-
> Identifier: BSD-2-Clause-Patent ; Module Name: ;@@ -13,7 +13,7 @@  ; ;------
> ------------------------------------------------------------------------ -#include
> "Fsp.h"+#include <Fsp.h>  SECTION .text diff --git
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfor
> mSecLib/SecFspWrapperPlatformSecLib.inf
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> rmSecLib/SecFspWrapperPlatformSecLib.inf
> index 2e0d67eae4..6806e000ce 100644
> ---
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfor
> mSecLib/SecFspWrapperPlatformSecLib.inf
> +++
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlat
> +++ formSecLib/SecFspWrapperPlatformSecLib.inf
> @@ -1,7 +1,7 @@
>  ## @file-#  Provide FSP wrapper platform sec related function.+#  Provide FSP
> wrapper platform sec related function for IA32. #-#  Copyright (c) 2017 -
> 2021, Intel Corporation. All rights reserved.<BR>+#  Copyright (c) 2017 - 2024,
> Intel Corporation. All rights reserved.<BR> # # SPDX-License-Identifier: BSD-2-
> Clause-Patent #@@ -25,7 +25,7 @@
>  # # The following information is for reference only and not required by the
> build tools. #-#  VALID_ARCHITECTURES           = IA32 X64+#
> VALID_ARCHITECTURES           = IA32 #
> ###################################################################
> #############@@ -47,7 +47,6 @@
>    Ia32/SecEntry.nasm   Ia32/PeiCoreEntry.nasm   Ia32/Stack.nasm-
> Ia32/Fsp.h
> ###################################################################
> ############# #@@ -96,3 +95,5 @@
>    gIntelFsp2WrapperTokenSpaceGuid.PcdFspmBaseAddress                  ##
> CONSUMES   gIntelFsp2WrapperTokenSpaceGuid.PcdFspModeSelection
> ## CONSUMES
> gMinPlatformPkgTokenSpaceGuid.PcdFspDispatchModeUseFspPeiMain       ##
> CONSUMES+  gMinPlatformPkgTokenSpaceGuid.PcdFsptUpdHeaderRevision
> ## CONSUMES+  gMinPlatformPkgTokenSpaceGuid.PcdFsptArchUpdRevision
> ## CONSUMESdiff --git
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfor
> mSecLib/SecFspWrapperPlatformSecLibResetVectorInFsp.inf
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> rmSecLib/SecFspWrapperPlatformSecLibResetVectorInFsp.inf
> new file mode 100644
> index 0000000000..ea062cfad1
> --- /dev/null
> +++
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlat
> +++ formSecLib/SecFspWrapperPlatformSecLibResetVectorInFsp.inf
> @@ -0,0 +1,101 @@
> +## @file+#  Provide FSP wrapper platform sec related function for X64.+#+#
> Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>+#+# SPDX-
> License-Identifier: BSD-2-Clause-
> Patent+#+#+##++####################################################
> ############################+#+# Defines Section - statements that will be
> processed to create a
> Makefile.+#+########################################################
> ########################+[Defines]+  INF_VERSION                    =
> 0x00010005+  BASE_NAME                      = SecFspWrapperPlatformSecLib+
> FILE_GUID                      = 94D8AA5C-5BAE-421F-B2C7-DD1A93BB4D3D+
> MODULE_TYPE                    = SEC+  VERSION_STRING                 = 1.0+
> LIBRARY_CLASS                  = PlatformSecLib+++#+# The following information is
> for reference only and not required by the build tools.+# This library is only
> supported in X64 when reset vector is in FSP.+#+#  VALID_ARCHITECTURES
> =
> X64+#++###########################################################
> #####################+#+# Sources Section - list of files that are required for
> the build to
> succeed.+#+########################################################
> ########################++[Sources]+  FspWrapperPlatformSecLib.c+
> SecRamInitData.c+  SecPlatformInformation.c+  SecGetPerformance.c+
> SecTempRamDone.c+  PlatformInit.c+  FsptCoreUpd.h++[Sources.X64]+
> X64/SecEntry.nasm+  X64/PeiCoreEntry.nasm+
> X64/Stack.nasm++##################################################
> ##############################+#+# Package Dependency Section - list of
> Package files that are required for+#                              this
> module.+#+#########################################################
> #######################++[Packages]+  MdePkg/MdePkg.dec+
> MdeModulePkg/MdeModulePkg.dec+  UefiCpuPkg/UefiCpuPkg.dec+
> IntelFsp2Pkg/IntelFsp2Pkg.dec+
> IntelFsp2WrapperPkg/IntelFsp2WrapperPkg.dec+
> MinPlatformPkg/MinPlatformPkg.dec++[LibraryClasses]+  LocalApicLib+
> SerialPortLib+  FspWrapperPlatformLib+  FspWrapperApiLib+  SecBoardInitLib+
> TestPointCheckLib+  PeiServicesTablePointerLib++[Ppis]+
> gEfiSecPlatformInformationPpiGuid       ## CONSUMES+
> gPeiSecPerformancePpiGuid               ## CONSUMES+
> gTopOfTemporaryRamPpiGuid               ## PRODUCES+
> gEfiPeiFirmwareVolumeInfoPpiGuid        ## PRODUCES+
> gFspTempRamExitPpiGuid                  ## CONSUMES+
> gPlatformInitTempRamExitPpiGuid         ## CONSUMES++[Pcd]+
> gUefiCpuPkgTokenSpaceGuid.PcdPeiTemporaryRamStackSize               ##
> CONSUMES+  gIntelFsp2WrapperTokenSpaceGuid.PcdFsptBaseAddress
> ## CONSUMES+  gIntelFsp2PkgTokenSpaceGuid.PcdFspTemporaryRamSize
> ## CONSUMES+
> gMinPlatformPkgTokenSpaceGuid.PcdSecSerialPortDebugEnable           ##
> CONSUMES++[FixedPcd]+
> gMinPlatformPkgTokenSpaceGuid.PcdFlashFvMicrocodeBase               ##
> CONSUMES+  gMinPlatformPkgTokenSpaceGuid.PcdFlashFvMicrocodeSize
> ## CONSUMES+  gMinPlatformPkgTokenSpaceGuid.PcdMicrocodeOffsetInFv
> ## CONSUMES+
> gIntelFsp2WrapperTokenSpaceGuid.PcdFlashCodeCacheAddress            ##
> CONSUMES+  gIntelFsp2WrapperTokenSpaceGuid.PcdFlashCodeCacheSize
> ## CONSUMES+  gIntelFsp2WrapperTokenSpaceGuid.PcdFspmBaseAddress
> ## CONSUMES+  gIntelFsp2WrapperTokenSpaceGuid.PcdFspModeSelection
> ## CONSUMES+
> gMinPlatformPkgTokenSpaceGuid.PcdFspDispatchModeUseFspPeiMain       ##
> CONSUMES+
> gMinPlatformPkgTokenSpaceGuid.PcdFspWrapperBfvforResetVectorInFsp   ##
> CONSUMES+  gMinPlatformPkgTokenSpaceGuid.PcdFsptUpdHeaderRevision
> ## CONSUMES+  gMinPlatformPkgTokenSpaceGuid.PcdFsptArchUpdRevision
> ## CONSUMESdiff --git
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfor
> mSecLib/SecGetPerformance.c
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> rmSecLib/SecGetPerformance.c
> index ac2deeabec..1699bd9710 100644
> ---
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfor
> mSecLib/SecGetPerformance.c
> +++
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlat
> +++ formSecLib/SecGetPerformance.c
> @@ -1,7 +1,7 @@
>  /** @file   Sample to provide SecGetPerformance function. -Copyright (c)
> 2017 - 2019, Intel Corporation. All rights reserved.<BR>+Copyright (c) 2017 -
> 2024, Intel Corporation. All rights reserved.<BR> SPDX-License-Identifier: BSD-
> 2-Clause-Patent  **/@@ -58,6 +58,7 @@ SecGetPerformance (
>    if (EFI_ERROR (Status)) {     return EFI_NOT_FOUND;   }+   //   // |--------------|
> <- TopOfTemporaryRam - BL   // |   List Ptr   |@@ -77,12 +78,12 @@
> SecGetPerformance (
>    // |  TSC[31:00]  |   // |--------------|   //-  TopOfTemporaryRam = (UINTN)
> TopOfTemporaryRamPpi - sizeof (UINT32);-  TopOfTemporaryRam -= sizeof
> (UINT32) * 2;-  Count             = *(UINT32 *)(TopOfTemporaryRam - sizeof
> (UINT32));+  TopOfTemporaryRam = (UINTN) TopOfTemporaryRamPpi - sizeof
> (UINTN);+  TopOfTemporaryRam -= sizeof(UINTN) * 2;+  Count             =
> *(UINT32 *) (UINTN) (TopOfTemporaryRam - sizeof (UINT32));   Size              =
> Count * sizeof (UINT32); -  Ticker = *(UINT64 *) (TopOfTemporaryRam - sizeof
> (UINT32) - Size - sizeof (UINT32) * 2);+  Ticker = *(UINT64 *) (UINTN)
> (TopOfTemporaryRam - sizeof (UINT32) - Size - sizeof (UINT64));
> Performance->ResetEnd = GetTimeInNanoSecond (Ticker);    return
> EFI_SUCCESS;diff --git
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfor
> mSecLib/SecPlatformInformation.c
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> rmSecLib/SecPlatformInformation.c
> index 24d55ed838..4cbde95c2d 100644
> ---
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfor
> mSecLib/SecPlatformInformation.c
> +++
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlat
> +++ formSecLib/SecPlatformInformation.c
> @@ -1,7 +1,7 @@
>  /** @file   Provide SecPlatformInformation function. -Copyright (c) 2017 -
> 2019, Intel Corporation. All rights reserved.<BR>+Copyright (c) 2017 - 2024,
> Intel Corporation. All rights reserved.<BR> SPDX-License-Identifier: BSD-2-
> Clause-Patent  **/@@ -59,9 +59,9 @@ SecPlatformInformation (
>    // This routine copies the BIST information to the buffer pointed by   //
> PlatformInformationRecord for output.   //-  TopOfTemporaryRam = (UINTN)
> TopOfTemporaryRamPpi - sizeof (UINT32);-  TopOfTemporaryRam -= sizeof
> (UINT32) * 2;-  Count             = *((UINT32 *)(TopOfTemporaryRam - sizeof
> (UINT32)));+  TopOfTemporaryRam = (UINTN) TopOfTemporaryRamPpi -
> sizeof (UINTN);+  TopOfTemporaryRam -= sizeof (UINTN) * 2;+  Count             =
> *((UINT32 *)(UINTN) (TopOfTemporaryRam - sizeof (UINT32)));   Size              =
> Count * sizeof (IA32_HANDOFF_STATUS);    if ((*StructureSize) < (UINT64)
> Size) {diff --git
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfor
> mSecLib/SecRamInitData.c
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> rmSecLib/SecRamInitData.c
> index 355d1e6509..49d5302a7b 100644
> ---
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfor
> mSecLib/SecRamInitData.c
> +++
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlat
> +++ formSecLib/SecRamInitData.c
> @@ -1,7 +1,7 @@
>  /** @file   Provide TempRamInitParams data. -Copyright (c) 2017 - 2021,
> Intel Corporation. All rights reserved.<BR>+Copyright (c) 2017 - 2024, Intel
> Corporation. All rights reserved.<BR> SPDX-License-Identifier: BSD-2-Clause-
> Patent  **/@@ -12,25 +12,70 @@ SPDX-License-Identifier: BSD-2-Clause-
> Patent
>   typedef struct {   FSP_UPD_HEADER    FspUpdHeader;+#if FixedPcdGet8
> (PcdFsptArchUpdRevision) == 1+  FSPT_ARCH_UPD     FsptArchUpd;+#elif
> FixedPcdGet8 (PcdFsptArchUpdRevision) == 2+  FSPT_ARCH2_UPD
> FsptArchUpd;+#endif   FSPT_CORE_UPD     FsptCoreUpd;-}
> FSPT_UPD_CORE_DATA;+  UINT16            UpdTerminator;+} FSPT_UPD_DATA; -
> GLOBAL_REMOVE_IF_UNREFERENCED CONST FSPT_UPD_CORE_DATA
> FsptUpdDataPtr = {+GLOBAL_REMOVE_IF_UNREFERENCED CONST
> FSPT_UPD_DATA FsptUpdDataPtr = {   {-    0x4450555F54505346,-    0x00,-    {
> 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,-      0x00, 0x00,
> 0x00, 0x00, 0x00, 0x00, 0x00+    0x4450555F54505346,
> // FSP-T UPD Header Signature - FSPT_UPD+    FixedPcdGet8
> (PcdFsptUpdHeaderRevision),                      // FSP-T UPD Header Revision+    {
> // Reserved[23]+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> 0x00,+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,+
> 0x00, 0x00, 0x00     }   },+#if FixedPcdGet8 (PcdFsptArchUpdRevision) == 1   {-
> FixedPcdGet32 (PcdFlashFvMicrocodeBase) + FixedPcdGet32
> (PcdMicrocodeOffsetInFv),-    FixedPcdGet32 (PcdFlashFvMicrocodeSize) -
> FixedPcdGet32 (PcdMicrocodeOffsetInFv),-    0,          // Set CodeRegionBase as
> 0, so that caching will be 4GB-(CodeRegionSize > LLCSize ? LLCSize :
> CodeRegionSize) will be used.-    FixedPcdGet32 (PcdFlashCodeCacheSize),-    {
> 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,+    0x01,
> // FSP-T ARCH UPD Revision+    {                                                             //
> Reserved[3]+      0x00, 0x00, 0x00+    },+    0x00000020,
> // Length of FSP-T ARCH UPD+    0,                                                            //
> FspDebugHandler+    {                                                             // Reserved1[20]+
> 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,+      0x00, 0x00,
> 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00+    }+  },+#elif FixedPcdGet8
> (PcdFsptArchUpdRevision) == 2+  {+    0x02,                                                         //
> FSP-T ARCH2 UPD Revision+    {                                                             // Reserved[3]+
> 0x00, 0x00, 0x00+    },+    0x00000020,                                                   // Length of
> FSP-T ARCH2 UPD+    0,                                                            // FspDebugHandler+    {
> // Reserved1[16]+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> 0x00,       0x00, 0x00, 0x00, 0x00, 0x00, 0x00     }-  }+  },+#endif+#if
> FixedPcdGet8 (PcdFsptArchUpdRevision) <= 1+  {+    FixedPcdGet32
> (PcdFlashFvMicrocodeBase) + FixedPcdGet32 (PcdMicrocodeOffsetInFv), //
> MicrocodeRegionBase+    FixedPcdGet32 (PcdFlashFvMicrocodeSize) -
> FixedPcdGet32 (PcdMicrocodeOffsetInFv), // MicrocodeRegionSize+    0, // Set
> CodeRegionBase as 0, so that caching will be 4GB-(CodeRegionSize > LLCSize ?
> LLCSize : CodeRegionSize) will be used.+    FixedPcdGet32
> (PcdFlashCodeCacheSize),                                            // CodeRegionSize+    {
> // Reserved[16]+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> 0x00,+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00+    }+  },+#else+  {+
> FixedPcdGet32 (PcdFlashFvMicrocodeBase) + FixedPcdGet32
> (PcdMicrocodeOffsetInFv), // MicrocodeRegionBase+    FixedPcdGet32
> (PcdFlashFvMicrocodeSize) - FixedPcdGet32 (PcdMicrocodeOffsetInFv), //
> MicrocodeRegionSize+    0, // Set CodeRegionBase as 0, so that caching will be
> 4GB-(CodeRegionSize > LLCSize ? LLCSize : CodeRegionSize) will be used.+
> FixedPcdGet32 (PcdFlashCodeCacheSize)                                             //
> CodeRegionSize+  },+#endif+  0x55AA };-diff --git
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfor
> mSecLib/X64/PeiCoreEntry.nasm
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> rmSecLib/X64/PeiCoreEntry.nasm
> new file mode 100644
> index 0000000000..af3affcf7f
> --- /dev/null
> +++
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlat
> +++ formSecLib/X64/PeiCoreEntry.nasm
> @@ -0,0 +1,202 @@
> +;------------------------------------------------------------------------------+;+;
> Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>+; SPDX-License-
> Identifier: BSD-2-Clause-Patent+;+; Module Name:+;+;  PeiCoreEntry.nasm+;+;
> Abstract:+;+;   Find and call SecStartup+;+;--------------------------------------------
> ----------------------------------++SECTION .text++extern
> ASM_PFX(SecStartup)+extern ASM_PFX(PlatformInit)+extern
> ASM_PFX(PcdGet64 (PcdFspWrapperBfvforResetVectorInFsp))++;--------------
> ---------------------------------------------------------------+;  Macro:
> PUSHA_64+;+;  Description:  Saves all registers on stack+;+;  Input:
> None+;+;  Output:       None+;-----------------------------------------------------------
> ------------------+%macro PUSHA_64   0+  push    r8+  push    r9+  push    r10+
> push    r11+  push    r12+  push    r13+  push    r14+  push    r15+  push    rax+
> push    rcx+  push    rdx+  push    rbx+  push    rsp+  push    rbp+  push    rsi+  push
> rdi+%endmacro++;-----------------------------------------------------------------------
> ------+;  Macro:        POPA_64+;+;  Description:  Restores all registers from
> stack+;+;  Input:        None+;+;  Output:       None+;-----------------------------------
> ------------------------------------------+%macro POPA_64   0+  pop    rdi+  pop
> rsi+  pop    rbp+  pop    rsp+  pop    rbx+  pop    rdx+  pop    rcx+  pop    rax+  pop
> r15+  pop    r14+  pop    r13+  pop    r12+  pop    r11+  pop    r10+  pop    r9+  pop
> r8+%endmacro++global
> ASM_PFX(CallPeiCoreEntryPoint)+ASM_PFX(CallPeiCoreEntryPoint):+  ;+  ; Per
> X64 calling convention, make sure RSP is 16-byte aligned.+  ;+  mov     rax, rsp+
> and     rax, 0fh+  sub     rsp, rax++  ;+  ; Platform init+  ;+  PUSHA_64+  sub     rsp,
> 20h+  call    ASM_PFX(PlatformInit)+  add     rsp, 20h+  POPA_64++  ;+  ; Set
> stack top pointer+  ;+  mov     rsp, r8++  ;+  ; Push the hob list pointer+  ;+  push
> rcx++  ;+  ; RBP holds start of BFV passed from Vtf0. Save it to r10.+  ;+  mov
> r10, rbp++  ;+  ; Save the value+  ;   RDX: start of range+  ;   r8: end of range+  ;+
> mov     rbp, rsp+  push    rdx+  push    r8+  mov     r14, rdx+  mov     r15, r8++  ;+
> ; Push processor count to stack first, then BIST status (AP then BSP)+  ;+  mov
> eax, 1+  cpuid+  shr     ebx, 16+  and     ebx, 0000000FFh+  cmp     bl, 1+  jae
> PushProcessorCount++  ;+  ; Some processors report 0 logical processors.
> Effectively 0 = 1.+  ; So we fix up the processor count+  ;+  inc
> ebx++PushProcessorCount:+  sub     rsp, 4+  mov     rdi, rsp+  mov     DWORD
> [rdi], ebx++  ;+  ; We need to implement a long-term solution for BIST capture.
> For now, we just copy BSP BIST+  ; for all processor threads+  ;+  xor     ecx, ecx+
> mov     cl, bl+PushBist:+  sub     rsp, 4+  mov     rdi, rsp+  movd    eax, mm0+
> mov     DWORD [rdi], eax+  loop    PushBist++  ;+  ; FSP saves the timestamp of
> the beginning of firmware execution in mm5.+  ; Get the timestamp from mm5
> and then push to stack.+  ;+  movq    rax, mm5+  push    rax++  ;+  ; Per X64
> calling convention, make sure RSP is 16-byte aligned.+  ;+  mov     rax, rsp+  and
> rax, 0fh+  sub     rsp, rax++  ;+  ; Pass entry point of the PEI core+  ;+  mov     rdi,
> 0FFFFFFE0h+  mov     edi, DWORD [rdi]+  mov     r9, rdi++  ;+  ; Pass BFV into the
> PEI Core+  ;+  ; Reset Vector and initial SEC core (to initialize Temp Ram) is part
> of FSP-O.+  ; Default UefiCpuPkg Reset Vector locates FSP-O as BFV. However
> the actual+  ; SEC core that launches PEI is part of another FV. We need to pass
> that FV+  ; as BFV to PEI core.+  ;+  mov     r8, ASM_PFX (PcdGet64
> (PcdFspWrapperBfvforResetVectorInFsp))+  mov     rcx, QWORD[r8]+  mov
> r8,  rcx++  ;+  ; Pass stack size into the PEI Core+  ;+  mov     rcx, r15  ; Start of
> TempRam+  mov     rdx, r14  ; End of TempRam++  sub     rcx, rdx  ; Size of
> TempRam++  ;+  ; Pass Control into the PEI Core+  ;+  sub     rsp, 20h+  call
> ASM_PFX(SecStartup)+diff --git
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfor
> mSecLib/X64/SecEntry.nasm
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> rmSecLib/X64/SecEntry.nasm
> new file mode 100644
> index 0000000000..de8ba83d52
> --- /dev/null
> +++
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlat
> +++ formSecLib/X64/SecEntry.nasm
> @@ -0,0 +1,71 @@
> +;------------------------------------------------------------------------------+;+;
> Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>+; SPDX-License-
> Identifier: BSD-2-Clause-Patent+; Module Name:+;+;  SecEntry.nasm+;+;
> Abstract:+;+;  This is the code that passes control to PEI core.+;+;-----------------
> -------------------------------------------------------------++#include
> <Fsp.h>++SECTION .text++extern   ASM_PFX(CallPeiCoreEntryPoint)+extern
> ASM_PFX(FsptUpdDataPtr)+; Pcds+extern   ASM_PFX(PcdGet32
> (PcdFspTemporaryRamSize))++;-------------------------------------------------------
> ---------------------+;+; Procedure:    _ModuleEntryPoint+;+; Input:        None+;+;
> Output:       None+;+; Destroys:     Assume all registers+;+; Description:+;+;
> After TempRamInit done, pass control to PEI core.+;+; Return:       None+;+;
> MMX Usage:+;              MM0 = BIST State+;+;------------------------------------------
> ----------------------------------++BITS 64+align 16+global
> ASM_PFX(_ModuleEntryPoint)+ASM_PFX(_ModuleEntryPoint):+  push    rax+
> mov     rax, ASM_PFX(FsptUpdDataPtr)  ; This is dummy code to include
> TempRamInitParams in SecCore for FSP-O.+#if
> FixedPcdGet8(PcdFspModeSelection) == 1+  mov     rax, ASM_PFX(PcdGet32
> (PcdFspTemporaryRamSize))+  sub     edx, dword [rax]              ; TemporaryRam
> for FSP+#endif+  pop     rax++  mov     r8,  rdx+  mov     rdx, rcx+  xor     ecx, ecx
> ; zero - no Hob List Yet+  mov     rsp, r8++  ;+  ; Per X64 calling convention, make
> sure RSP is 16-byte aligned.+  ;+  mov     rax, rsp+  and     rax, 0fh+  sub     rsp,
> rax++  call    ASM_PFX(CallPeiCoreEntryPoint)++  jmp     $diff --git
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfor
> mSecLib/X64/Stack.nasm
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> rmSecLib/X64/Stack.nasm
> new file mode 100644
> index 0000000000..21010bf4ef
> --- /dev/null
> +++
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlat
> +++ formSecLib/X64/Stack.nasm
> @@ -0,0 +1,72 @@
> +;------------------------------------------------------------------------------+;+;
> Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>+; SPDX-License-
> Identifier: BSD-2-Clause-Patent+; Abstract:+;+;   Switch the stack from
> temporary memory to permanent memory.+;+;-------------------------------------
> -----------------------------------------++    SECTION .text++;---------------------------
> ---------------------------------------------------+; VOID+; EFIAPI+; SecSwitchStack
> (+;   UINT32   TemporaryMemoryBase,+;   UINT32   PermanentMemoryBase+;
> );+;------------------------------------------------------------------------------+global
> ASM_PFX(SecSwitchStack)+ASM_PFX(SecSwitchStack):+    ;+    ; Save four
> register: rax, rbx, rcx, rdx+    ;+    push  rax+    push  rbx+    push  rcx+    push
> rdx++    ;+    ; !!CAUTION!! this function address's is pushed into stack after+    ;
> migration of whole temporary memory, so need save it to permanent+    ;
> memory at first!+    ;++    mov   rbx, rcx                 ; Save the first parameter+
> mov   rcx, rdx                 ; Save the second parameter++    ;+    ; Save this
> function's return address into permanent memory at first.+    ; Then, Fixup the
> esp point to permanent memory+    ;+    mov   rax, rsp+    sub   rax, rbx+    add
> rax, rcx+    mov   rdx, qword [rsp]         ; copy pushed register's value to
> permanent memory+    mov   qword [rax], rdx+    mov   rdx, qword [rsp + 8]+
> mov   qword [rax + 8], rdx+    mov   rdx, qword [rsp + 16]+    mov   qword [rax +
> 16], rdx+    mov   rdx, qword [rsp + 24]+    mov   qword [rax + 24], rdx+    mov
> rdx, qword [rsp + 32]    ; Update this function's return address into permanent
> memory+    mov   qword [rax + 32], rdx+    mov   rsp, rax                 ; From now,
> rsp is pointed to permanent memory++    ;+    ; Fixup the rbp point to
> permanent memory+    ;+    mov   rax, rbp+    sub   rax, rbx+    add   rax, rcx+
> mov   rbp, rax                 ; From now, rbp is pointed to permanent memory++
> pop   rdx+    pop   rcx+    pop   rbx+    pop   rax+    ret+diff --git
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfor
> mSecLib/Ia32/Fsp.h b/Platform/Intel/MinPlatformPkg/Include/Fsp.h
> similarity index 79%
> rename from
> Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatform
> SecLib/Ia32/Fsp.h
> rename to Platform/Intel/MinPlatformPkg/Include/Fsp.h
> index 9f6cdcf476..319e1e3372 100644
> ---
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfor
> mSecLib/Ia32/Fsp.h
> +++ b/Platform/Intel/MinPlatformPkg/Include/Fsp.h
> @@ -1,7 +1,7 @@
>  /** @file   Fsp related definitions -Copyright (c) 2017, Intel Corporation. All
> rights reserved.<BR>+Copyright (c) 2017 - 2024, Intel Corporation. All rights
> reserved.<BR> SPDX-License-Identifier: BSD-2-Clause-Patent  **/@@ -36,7
> +36,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
>  // // Fsp Header //-#define FSP_HEADER_IMAGEBASE_OFFSET     0x1C-
> #define FSP_HEADER_TEMPRAMINIT_OFFSET   0x30+#define
> FSP_HEADER_IMAGEBASE_OFFSET   0x1C+#define
> FSP_HEADER_TEMPRAMINIT_OFFSET 0x30  #endifdiff --git
> a/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dec
> b/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dec
> index a14c6b2db5..12f86585ad 100644
> --- a/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dec
> +++ b/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dec
> @@ -6,7 +6,7 @@
>  # INF files to generate AutoGen.c and AutoGen.h files # for the build
> infrastructure. #-# Copyright (c) 2017 - 2021, Intel Corporation. All rights
> reserved.<BR>+# Copyright (c) 2017 - 2024, Intel Corporation. All rights
> reserved.<BR> # Copyright (C) 2023 Advanced Micro Devices, Inc. All rights
> reserved.<BR> # # SPDX-License-Identifier: BSD-2-Clause-Patent@@ -393,6
> +393,21 @@
>    #
> gMinPlatformPkgTokenSpaceGuid.PcdFspDispatchModeUseFspPeiMain|TRUE
> |BOOLEAN|0xF00000A8 +  ## BFV Location for Reset Vector in FSP+  # The
> default of BFV Location for Reset Vector in FSP is 0x00000000FFFF0000.+  #+
> gMinPlatformPkgTokenSpaceGuid.PcdFspWrapperBfvforResetVectorInFsp|0x
> 00000000FFFF0000|UINT64|0xF00000A9++  ## FSP-T UPD Header
> Revision+  # The default of FSP-T UPD Header Revision is 0.+  #+
> gMinPlatformPkgTokenSpaceGuid.PcdFsptUpdHeaderRevision|0x0|UINT8|0x
> F00000AA++  ## FSP-T ARCH UPD Revision+  # The default of FSP-T ARCH UPD
> Revision is 0.+  #+
> gMinPlatformPkgTokenSpaceGuid.PcdFsptArchUpdRevision|0x0|UINT8|0xF0
> 0000AC+ [PcdsFeatureFlag]
> gMinPlatformPkgTokenSpaceGuid.PcdStopAfterDebugInit
> |FALSE|BOOLEAN|0xF00000A1--
> 2.40.1.windows.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#114750): https://edk2.groups.io/g/devel/message/114750
Mute This Topic: https://groups.io/mt/103478590/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [edk2-devel][edk2-platforms][PATCH v4] MinPlatformPkg: Support SecFspWrapperPlatformSecLib in X64
  2024-01-29 23:39 ` Nate DeSimone
@ 2024-01-30  7:51   ` Kuo, Ted
  0 siblings, 0 replies; 4+ messages in thread
From: Kuo, Ted @ 2024-01-30  7:51 UTC (permalink / raw)
  To: Desimone, Nathaniel L, devel@edk2.groups.io
  Cc: Chaganty, Rangasai V, Chiu, Chasel, Dong, Eric, S, Ashraf Ali,
	Duggapu, Chinni B, Gao, Liming

Hi Nate,

I've sent out patch v5 to support the scenarios below in SecFspWrapperPlatformSecLib expect "IA32 + FSP Reset Vector" as we don't have plan to support it in any Intel platform. Can you please review patch v5 again?

- IA32 + Bootloader Reset Vector
- X64 + Bootloader Reset Vector (by setting PcdFspWrapperResetVectorInFsp to FALSE)
- X64 + FSP Reset Vector (by setting PcdFspWrapperResetVectorInFsp to TRUE)

Thanks,
Ted

-----Original Message-----
From: Desimone, Nathaniel L <nathaniel.l.desimone@intel.com> 
Sent: Tuesday, January 30, 2024 7:39 AM
To: Kuo, Ted <ted.kuo@intel.com>; devel@edk2.groups.io
Cc: Chaganty, Rangasai V <rangasai.v.chaganty@intel.com>; Chiu, Chasel <chasel.chiu@intel.com>; Dong, Eric <eric.dong@intel.com>; S, Ashraf Ali <ashraf.ali.s@intel.com>; Duggapu, Chinni B <chinni.b.duggapu@intel.com>; Gao, Liming <gaoliming@byosoft.com.cn>
Subject: RE: [edk2-devel][edk2-platforms][PATCH v4] MinPlatformPkg: Support SecFspWrapperPlatformSecLib in X64

Hi Ted,

The scenario where we have a 64-bit FSP that does not support reset vector in FSP-O is likely to happen in a future Intel platform. As such, please implement this feature in a manner that does not require all assembly code in the X64 folder to use FSP-O.

Thanks,
Nate

> -----Original Message-----
> From: Kuo, Ted <ted.kuo@intel.com>
> Sent: Tuesday, January 2, 2024 1:41 AM
> To: devel@edk2.groups.io
> Cc: Chaganty, Rangasai V <rangasai.v.chaganty@intel.com>; Chiu, Chasel 
> <chasel.chiu@intel.com>; Desimone, Nathaniel L 
> <nathaniel.l.desimone@intel.com>; Dong, Eric <eric.dong@intel.com>; S, 
> Ashraf Ali <ashraf.ali.s@intel.com>; Duggapu, Chinni B 
> <chinni.b.duggapu@intel.com>; Gao, Liming <gaoliming@byosoft.com.cn>
> Subject: [edk2-devel][edk2-platforms][PATCH v4] MinPlatformPkg: 
> Support SecFspWrapperPlatformSecLib in X64
> 
> https://bugzilla.tianocore.org/show_bug.cgi?id=4623
> 1.Added PeiCoreEntry.nasm, SecEntry.nasm and Stack.nasm for X64.
> 2.Made changes in common files to support both IA32 and X64.
> 3.Added the PCDs below for FSP-T UPD revisions and reset vector in FSP.
>  - PcdFspWrapperBfvforResetVectorInFsp
>  - PcdFsptUpdHeaderRevision
>  - PcdFsptArchUpdRevision
> 
> Cc: Sai Chaganty <rangasai.v.chaganty@intel.com>
> Cc: Chasel Chiu <chasel.chiu@intel.com>
> Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>
> Cc: Eric Dong <eric.dong@intel.com>
> Cc: Ashraf Ali S <ashraf.ali.s@intel.com>
> Cc: Chinni B Duggapu <chinni.b.duggapu@intel.com>
> Cc: Liming Gao <gaoliming@byosoft.com.cn>
> Signed-off-by: Ted Kuo <ted.kuo@intel.com>
> ---
>  .../SecFspWrapperPlatformSecLib/FsptCoreUpd.h |  25 ++-
>  .../Ia32/SecEntry.nasm                        |   4 +-
>  .../SecFspWrapperPlatformSecLib.inf           |   9 +-
>  ...pWrapperPlatformSecLibResetVectorInFsp.inf | 101 +++++++++
>  .../SecGetPerformance.c                       |  11 +-
>  .../SecPlatformInformation.c                  |   8 +-
>  .../SecRamInitData.c                          |  73 +++++--
>  .../X64/PeiCoreEntry.nasm                     | 202 ++++++++++++++++++
>  .../X64/SecEntry.nasm                         |  71 ++++++
>  .../X64/Stack.nasm                            |  72 +++++++
>  .../Ia32 => Include}/Fsp.h                    |   6 +-
>  .../Intel/MinPlatformPkg/MinPlatformPkg.dec   |  17 +-
>  12 files changed, 565 insertions(+), 34 deletions(-)  create mode 
> 100644 
> Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatform
> SecLib/SecFspWrapperPlatformSecLibResetVectorInFsp.inf
>  create mode 100644
> Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatform
> SecLib/X64/PeiCoreEntry.nasm
>  create mode 100644
> Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatform
> SecLib/X64/SecEntry.nasm
>  create mode 100644
> Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatform
> SecLib/X64/Stack.nasm
>  rename
> Platform/Intel/MinPlatformPkg/{FspWrapper/Library/SecFspWrapperPlatfor
> mSecLib/Ia32 => Include}/Fsp.h (79%)
> 
> diff --git
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> r
> mSecLib/FsptCoreUpd.h
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> rmSecLib/FsptCoreUpd.h
> index 7c0f605b92..24c18f25b8 100644
> ---
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> r
> mSecLib/FsptCoreUpd.h
> +++
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlat
> +++ formSecLib/FsptCoreUpd.h
> @@ -1,6 +1,6 @@
>  /** @file -Copyright (c) 2017, Intel Corporation. All rights 
> reserved.<BR>+Copyright (c) 2017 - 2024, Intel Corporation. All rights 
> reserved.<BR> SPDX-License-Identifier: BSD-2-Clause-Patent  **/@@ 
> -10,6
> +10,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
>   #pragma pack(1) +#if FixedPcdGet8 (PcdFsptArchUpdRevision) <= 1 /** 
> Fsp T Core UPD **/ typedef struct {@@ -34,6 +35,28 @@ typedef struct {
>  **/   UINT8                       Reserved[16]; } FSPT_CORE_UPD;+#else+/** Fsp T
> Core UPD+**/+typedef struct {++/** Offset 0x0040+**/+
> EFI_PHYSICAL_ADDRESS        MicrocodeRegionBase;++/** Offset 0x0048+**/+
> UINT64                      MicrocodeRegionSize;++/** Offset 0x0050+**/+
> EFI_PHYSICAL_ADDRESS        CodeRegionBase;++/** Offset 0x0058+**/+
> UINT64                      CodeRegionSize;+} FSPT_CORE_UPD;+#endif  #pragma
> pack() diff --git
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> r
> mSecLib/Ia32/SecEntry.nasm
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> rmSecLib/Ia32/SecEntry.nasm
> index 7f6d771e41..0b3f343991 100644
> ---
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> r
> mSecLib/Ia32/SecEntry.nasm
> +++
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlat
> +++ formSecLib/Ia32/SecEntry.nasm
> @@ -1,6 +1,6 @@
>  
> ;---------------------------------------------------------------------
> --------- ;-; Copyright (c) 2019, Intel Corporation. All rights 
> reserved.<BR>+; Copyright (c)
> 2019 - 2024, Intel Corporation. All rights reserved.<BR> ; 
> SPDX-License-
> Identifier: BSD-2-Clause-Patent ; Module Name: ;@@ -13,7 +13,7 @@  ; 
> ;------
> ----------------------------------------------------------------------
> -- -#include "Fsp.h"+#include <Fsp.h>  SECTION .text diff --git 
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> r mSecLib/SecFspWrapperPlatformSecLib.inf
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> rmSecLib/SecFspWrapperPlatformSecLib.inf
> index 2e0d67eae4..6806e000ce 100644
> ---
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> r mSecLib/SecFspWrapperPlatformSecLib.inf
> +++
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlat
> +++ formSecLib/SecFspWrapperPlatformSecLib.inf
> @@ -1,7 +1,7 @@
>  ## @file-#  Provide FSP wrapper platform sec related function.+#  
> Provide FSP wrapper platform sec related function for IA32. #-#  
> Copyright (c) 2017 - 2021, Intel Corporation. All rights 
> reserved.<BR>+#  Copyright (c) 2017 - 2024, Intel Corporation. All 
> rights reserved.<BR> # # SPDX-License-Identifier: BSD-2- Clause-Patent 
> #@@ -25,7 +25,7 @@  # # The following information is for reference only and not required by the
> build tools. #-#  VALID_ARCHITECTURES           = IA32 X64+#
> VALID_ARCHITECTURES           = IA32 #
> ###################################################################
> #############@@ -47,7 +47,6 @@
>    Ia32/SecEntry.nasm   Ia32/PeiCoreEntry.nasm   Ia32/Stack.nasm-
> Ia32/Fsp.h
> ###################################################################
> ############# #@@ -96,3 +95,5 @@
>    gIntelFsp2WrapperTokenSpaceGuid.PcdFspmBaseAddress                  ##
> CONSUMES   gIntelFsp2WrapperTokenSpaceGuid.PcdFspModeSelection
> ## CONSUMES
> gMinPlatformPkgTokenSpaceGuid.PcdFspDispatchModeUseFspPeiMain       ##
> CONSUMES+  gMinPlatformPkgTokenSpaceGuid.PcdFsptUpdHeaderRevision
> ## CONSUMES+  gMinPlatformPkgTokenSpaceGuid.PcdFsptArchUpdRevision
> ## CONSUMESdiff --git
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> r mSecLib/SecFspWrapperPlatformSecLibResetVectorInFsp.inf
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> rmSecLib/SecFspWrapperPlatformSecLibResetVectorInFsp.inf
> new file mode 100644
> index 0000000000..ea062cfad1
> --- /dev/null
> +++
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlat
> +++ formSecLib/SecFspWrapperPlatformSecLibResetVectorInFsp.inf
> @@ -0,0 +1,101 @@
> +## @file+#  Provide FSP wrapper platform sec related function for 
> +X64.+#+#
> Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>+#+# 
> SPDX-
> License-Identifier: BSD-2-Clause-
> Patent+#+#+##++####################################################
> ############################+#+# Defines Section - statements that 
> will be processed to create a 
> Makefile.+#+########################################################
> ########################+[Defines]+  INF_VERSION                    =
> 0x00010005+  BASE_NAME                      = SecFspWrapperPlatformSecLib+
> FILE_GUID                      = 94D8AA5C-5BAE-421F-B2C7-DD1A93BB4D3D+
> MODULE_TYPE                    = SEC+  VERSION_STRING                 = 1.0+
> LIBRARY_CLASS                  = PlatformSecLib+++#+# The following information is
> for reference only and not required by the build tools.+# This library 
> is only supported in X64 when reset vector is in FSP.+#+#  
> VALID_ARCHITECTURES =
> X64+#++###########################################################
> #####################+#+# Sources Section - list of files that are 
> required for the build to 
> succeed.+#+########################################################
> ########################++[Sources]+  FspWrapperPlatformSecLib.c+ 
> SecRamInitData.c+  SecPlatformInformation.c+  SecGetPerformance.c+ 
> SecTempRamDone.c+  PlatformInit.c+  FsptCoreUpd.h++[Sources.X64]+ 
> X64/SecEntry.nasm+  X64/PeiCoreEntry.nasm+ 
> X64/Stack.nasm++##################################################
> ##############################+#+# Package Dependency Section - list of
> Package files that are required for+#                              this
> module.+#+#########################################################
> #######################++[Packages]+  MdePkg/MdePkg.dec+ 
> MdeModulePkg/MdeModulePkg.dec+  UefiCpuPkg/UefiCpuPkg.dec+ 
> IntelFsp2Pkg/IntelFsp2Pkg.dec+ 
> IntelFsp2WrapperPkg/IntelFsp2WrapperPkg.dec+
> MinPlatformPkg/MinPlatformPkg.dec++[LibraryClasses]+  LocalApicLib+
> SerialPortLib+  FspWrapperPlatformLib+  FspWrapperApiLib+  
> SerialPortLib+ SecBoardInitLib+
> TestPointCheckLib+  PeiServicesTablePointerLib++[Ppis]+
> gEfiSecPlatformInformationPpiGuid       ## CONSUMES+
> gPeiSecPerformancePpiGuid               ## CONSUMES+
> gTopOfTemporaryRamPpiGuid               ## PRODUCES+
> gEfiPeiFirmwareVolumeInfoPpiGuid        ## PRODUCES+
> gFspTempRamExitPpiGuid                  ## CONSUMES+
> gPlatformInitTempRamExitPpiGuid         ## CONSUMES++[Pcd]+
> gUefiCpuPkgTokenSpaceGuid.PcdPeiTemporaryRamStackSize               ##
> CONSUMES+  gIntelFsp2WrapperTokenSpaceGuid.PcdFsptBaseAddress
> ## CONSUMES+  gIntelFsp2PkgTokenSpaceGuid.PcdFspTemporaryRamSize
> ## CONSUMES+
> gMinPlatformPkgTokenSpaceGuid.PcdSecSerialPortDebugEnable           ##
> CONSUMES++[FixedPcd]+
> gMinPlatformPkgTokenSpaceGuid.PcdFlashFvMicrocodeBase               ##
> CONSUMES+  gMinPlatformPkgTokenSpaceGuid.PcdFlashFvMicrocodeSize
> ## CONSUMES+  gMinPlatformPkgTokenSpaceGuid.PcdMicrocodeOffsetInFv
> ## CONSUMES+
> gIntelFsp2WrapperTokenSpaceGuid.PcdFlashCodeCacheAddress            ##
> CONSUMES+  gIntelFsp2WrapperTokenSpaceGuid.PcdFlashCodeCacheSize
> ## CONSUMES+  gIntelFsp2WrapperTokenSpaceGuid.PcdFspmBaseAddress
> ## CONSUMES+  gIntelFsp2WrapperTokenSpaceGuid.PcdFspModeSelection
> ## CONSUMES+
> gMinPlatformPkgTokenSpaceGuid.PcdFspDispatchModeUseFspPeiMain       ##
> CONSUMES+
> gMinPlatformPkgTokenSpaceGuid.PcdFspWrapperBfvforResetVectorInFsp   ##
> CONSUMES+  gMinPlatformPkgTokenSpaceGuid.PcdFsptUpdHeaderRevision
> ## CONSUMES+  gMinPlatformPkgTokenSpaceGuid.PcdFsptArchUpdRevision
> ## CONSUMESdiff --git
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> r
> mSecLib/SecGetPerformance.c
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> rmSecLib/SecGetPerformance.c
> index ac2deeabec..1699bd9710 100644
> ---
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> r
> mSecLib/SecGetPerformance.c
> +++
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlat
> +++ formSecLib/SecGetPerformance.c
> @@ -1,7 +1,7 @@
>  /** @file   Sample to provide SecGetPerformance function. -Copyright (c)
> 2017 - 2019, Intel Corporation. All rights reserved.<BR>+Copyright (c) 
> 2017 - 2024, Intel Corporation. All rights reserved.<BR> 
> SPDX-License-Identifier: BSD- 2-Clause-Patent  **/@@ -58,6 +58,7 @@ SecGetPerformance (
>    if (EFI_ERROR (Status)) {     return EFI_NOT_FOUND;   }+   //   // |--------------|
> <- TopOfTemporaryRam - BL   // |   List Ptr   |@@ -77,12 +78,12 @@
> SecGetPerformance (
>    // |  TSC[31:00]  |   // |--------------|   //-  TopOfTemporaryRam = (UINTN)
> TopOfTemporaryRamPpi - sizeof (UINT32);-  TopOfTemporaryRam -= sizeof
> (UINT32) * 2;-  Count             = *(UINT32 *)(TopOfTemporaryRam - sizeof
> (UINT32));+  TopOfTemporaryRam = (UINTN) TopOfTemporaryRamPpi - sizeof
> (UINTN);+  TopOfTemporaryRam -= sizeof(UINTN) * 2;+  Count             =
> *(UINT32 *) (UINTN) (TopOfTemporaryRam - sizeof (UINT32));   Size              =
> Count * sizeof (UINT32); -  Ticker = *(UINT64 *) (TopOfTemporaryRam - 
> sizeof
> (UINT32) - Size - sizeof (UINT32) * 2);+  Ticker = *(UINT64 *) (UINTN) 
> (TopOfTemporaryRam - sizeof (UINT32) - Size - sizeof (UINT64));
> Performance->ResetEnd = GetTimeInNanoSecond (Ticker);    return
> EFI_SUCCESS;diff --git
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> r
> mSecLib/SecPlatformInformation.c
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> rmSecLib/SecPlatformInformation.c
> index 24d55ed838..4cbde95c2d 100644
> ---
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> r
> mSecLib/SecPlatformInformation.c
> +++
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlat
> +++ formSecLib/SecPlatformInformation.c
> @@ -1,7 +1,7 @@
>  /** @file   Provide SecPlatformInformation function. -Copyright (c) 2017 -
> 2019, Intel Corporation. All rights reserved.<BR>+Copyright (c) 2017 - 
> 2024, Intel Corporation. All rights reserved.<BR> 
> SPDX-License-Identifier: BSD-2- Clause-Patent  **/@@ -59,9 +59,9 @@ SecPlatformInformation (
>    // This routine copies the BIST information to the buffer pointed by   //
> PlatformInformationRecord for output.   //-  TopOfTemporaryRam = (UINTN)
> TopOfTemporaryRamPpi - sizeof (UINT32);-  TopOfTemporaryRam -= sizeof
> (UINT32) * 2;-  Count             = *((UINT32 *)(TopOfTemporaryRam - sizeof
> (UINT32)));+  TopOfTemporaryRam = (UINTN) TopOfTemporaryRamPpi -
> sizeof (UINTN);+  TopOfTemporaryRam -= sizeof (UINTN) * 2;+  Count             =
> *((UINT32 *)(UINTN) (TopOfTemporaryRam - sizeof (UINT32)));   Size              =
> Count * sizeof (IA32_HANDOFF_STATUS);    if ((*StructureSize) < (UINT64)
> Size) {diff --git
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> r
> mSecLib/SecRamInitData.c
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> rmSecLib/SecRamInitData.c
> index 355d1e6509..49d5302a7b 100644
> ---
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> r
> mSecLib/SecRamInitData.c
> +++
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlat
> +++ formSecLib/SecRamInitData.c
> @@ -1,7 +1,7 @@
>  /** @file   Provide TempRamInitParams data. -Copyright (c) 2017 - 2021,
> Intel Corporation. All rights reserved.<BR>+Copyright (c) 2017 - 2024, 
> Intel Corporation. All rights reserved.<BR> SPDX-License-Identifier: 
> BSD-2-Clause- Patent  **/@@ -12,25 +12,70 @@ SPDX-License-Identifier: 
> BSD-2-Clause- Patent
>   typedef struct {   FSP_UPD_HEADER    FspUpdHeader;+#if FixedPcdGet8
> (PcdFsptArchUpdRevision) == 1+  FSPT_ARCH_UPD     FsptArchUpd;+#elif
> FixedPcdGet8 (PcdFsptArchUpdRevision) == 2+  FSPT_ARCH2_UPD
> FsptArchUpd;+#endif   FSPT_CORE_UPD     FsptCoreUpd;-}
> FSPT_UPD_CORE_DATA;+  UINT16            UpdTerminator;+} FSPT_UPD_DATA; -
> GLOBAL_REMOVE_IF_UNREFERENCED CONST FSPT_UPD_CORE_DATA FsptUpdDataPtr 
> = {+GLOBAL_REMOVE_IF_UNREFERENCED CONST
> FSPT_UPD_DATA FsptUpdDataPtr = {   {-    0x4450555F54505346,-    0x00,-    {
> 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,-      0x00, 0x00,
> 0x00, 0x00, 0x00, 0x00, 0x00+    0x4450555F54505346,
> // FSP-T UPD Header Signature - FSPT_UPD+    FixedPcdGet8
> (PcdFsptUpdHeaderRevision),                      // FSP-T UPD Header Revision+    {
> // Reserved[23]+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> 0x00,+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,+
> 0x00, 0x00, 0x00     }   },+#if FixedPcdGet8 (PcdFsptArchUpdRevision) == 1   {-
> FixedPcdGet32 (PcdFlashFvMicrocodeBase) + FixedPcdGet32
> (PcdMicrocodeOffsetInFv),-    FixedPcdGet32 (PcdFlashFvMicrocodeSize) -
> FixedPcdGet32 (PcdMicrocodeOffsetInFv),-    0,          // Set CodeRegionBase as
> 0, so that caching will be 4GB-(CodeRegionSize > LLCSize ? LLCSize :
> CodeRegionSize) will be used.-    FixedPcdGet32 (PcdFlashCodeCacheSize),-    {
> 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,+    0x01,
> // FSP-T ARCH UPD Revision+    {                                                             //
> Reserved[3]+      0x00, 0x00, 0x00+    },+    0x00000020,
> // Length of FSP-T ARCH UPD+    0,                                                            //
> FspDebugHandler+    {                                                             // Reserved1[20]+
> 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,+      0x00, 0x00,
> 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00+    }+  },+#elif FixedPcdGet8
> (PcdFsptArchUpdRevision) == 2+  {+    0x02,                                                         //
> FSP-T ARCH2 UPD Revision+    {                                                             // Reserved[3]+
> 0x00, 0x00, 0x00+    },+    0x00000020,                                                   // Length of
> FSP-T ARCH2 UPD+    0,                                                            // FspDebugHandler+    {
> // Reserved1[16]+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> 0x00,       0x00, 0x00, 0x00, 0x00, 0x00, 0x00     }-  }+  },+#endif+#if
> FixedPcdGet8 (PcdFsptArchUpdRevision) <= 1+  {+    FixedPcdGet32
> (PcdFlashFvMicrocodeBase) + FixedPcdGet32 (PcdMicrocodeOffsetInFv), //
> MicrocodeRegionBase+    FixedPcdGet32 (PcdFlashFvMicrocodeSize) -
> FixedPcdGet32 (PcdMicrocodeOffsetInFv), // MicrocodeRegionSize+    0, // Set
> CodeRegionBase as 0, so that caching will be 4GB-(CodeRegionSize > LLCSize ?
> LLCSize : CodeRegionSize) will be used.+    FixedPcdGet32
> (PcdFlashCodeCacheSize),                                            // CodeRegionSize+    {
> // Reserved[16]+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> 0x00,+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00+    }+  },+#else+  {+
> FixedPcdGet32 (PcdFlashFvMicrocodeBase) + FixedPcdGet32
> (PcdMicrocodeOffsetInFv), // MicrocodeRegionBase+    FixedPcdGet32
> (PcdFlashFvMicrocodeSize) - FixedPcdGet32 (PcdMicrocodeOffsetInFv), //
> MicrocodeRegionSize+    0, // Set CodeRegionBase as 0, so that caching 
> MicrocodeRegionSize+ will be
> 4GB-(CodeRegionSize > LLCSize ? LLCSize : CodeRegionSize) will be used.+
> FixedPcdGet32 (PcdFlashCodeCacheSize)                                             //
> CodeRegionSize+  },+#endif+  0x55AA };-diff --git
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> r
> mSecLib/X64/PeiCoreEntry.nasm
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> rmSecLib/X64/PeiCoreEntry.nasm
> new file mode 100644
> index 0000000000..af3affcf7f
> --- /dev/null
> +++
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlat
> +++ formSecLib/X64/PeiCoreEntry.nasm
> @@ -0,0 +1,202 @@
> +;--------------------------------------------------------------------
> +----------+;+;
> Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>+; 
> SPDX-License-
> Identifier: BSD-2-Clause-Patent+;+; Module Name:+;+;  PeiCoreEntry.nasm+;+;
> Abstract:+;+;   Find and call SecStartup+;+;--------------------------------------------
> ----------------------------------++SECTION .text++extern
> ASM_PFX(SecStartup)+extern ASM_PFX(PlatformInit)+extern
> ASM_PFX(PcdGet64 
> (PcdFspWrapperBfvforResetVectorInFsp))++;--------------
> ---------------------------------------------------------------+;  Macro:
> PUSHA_64+;+;  Description:  Saves all registers on stack+;+;  Input:
> None+;+;  Output:       None+;-----------------------------------------------------------
> ------------------+%macro PUSHA_64   0+  push    r8+  push    r9+  push    r10+
> push    r11+  push    r12+  push    r13+  push    r14+  push    r15+  push    rax+
> push    rcx+  push    rdx+  push    rbx+  push    rsp+  push    rbp+  push    rsi+  push
> rdi+%endmacro++;------------------------------------------------------
> rdi+-----------------
> ------+;  Macro:        POPA_64+;+;  Description:  Restores all registers from
> stack+;+;  Input:        None+;+;  Output:       None+;-----------------------------------
> ------------------------------------------+%macro POPA_64   0+  pop    rdi+  pop
> rsi+  pop    rbp+  pop    rsp+  pop    rbx+  pop    rdx+  pop    rcx+  pop    rax+  pop
> r15+  pop    r14+  pop    r13+  pop    r12+  pop    r11+  pop    r10+  pop    r9+  pop
> r8+%endmacro++global
> ASM_PFX(CallPeiCoreEntryPoint)+ASM_PFX(CallPeiCoreEntryPoint):+  ;+  ; Per
> X64 calling convention, make sure RSP is 16-byte aligned.+  ;+  mov     rax, rsp+
> and     rax, 0fh+  sub     rsp, rax++  ;+  ; Platform init+  ;+  PUSHA_64+  sub     rsp,
> 20h+  call    ASM_PFX(PlatformInit)+  add     rsp, 20h+  POPA_64++  ;+  ; Set
> stack top pointer+  ;+  mov     rsp, r8++  ;+  ; Push the hob list pointer+  ;+  push
> rcx++  ;+  ; RBP holds start of BFV passed from Vtf0. Save it to r10.+  
> rcx++ ;+  mov
> r10, rbp++  ;+  ; Save the value+  ;   RDX: start of range+  ;   r8: end of range+  ;+
> mov     rbp, rsp+  push    rdx+  push    r8+  mov     r14, rdx+  mov     r15, r8++  ;+
> ; Push processor count to stack first, then BIST status (AP then BSP)+  ;+  mov
> eax, 1+  cpuid+  shr     ebx, 16+  and     ebx, 0000000FFh+  cmp     bl, 1+  jae
> PushProcessorCount++  ;+  ; Some processors report 0 logical processors.
> Effectively 0 = 1.+  ; So we fix up the processor count+  ;+  inc
> ebx++PushProcessorCount:+  sub     rsp, 4+  mov     rdi, rsp+  mov     DWORD
> [rdi], ebx++  ;+  ; We need to implement a long-term solution for BIST capture.
> For now, we just copy BSP BIST+  ; for all processor threads+  ;+  xor     ecx, ecx+
> mov     cl, bl+PushBist:+  sub     rsp, 4+  mov     rdi, rsp+  movd    eax, mm0+
> mov     DWORD [rdi], eax+  loop    PushBist++  ;+  ; FSP saves the timestamp of
> the beginning of firmware execution in mm5.+  ; Get the timestamp from mm5
> and then push to stack.+  ;+  movq    rax, mm5+  push    rax++  ;+  ; Per X64
> calling convention, make sure RSP is 16-byte aligned.+  ;+  mov     rax, rsp+  and
> rax, 0fh+  sub     rsp, rax++  ;+  ; Pass entry point of the PEI core+  ;+  mov     rdi,
> 0FFFFFFE0h+  mov     edi, DWORD [rdi]+  mov     r9, rdi++  ;+  ; Pass BFV into the
> PEI Core+  ;+  ; Reset Vector and initial SEC core (to initialize Temp 
> Ram) is part of FSP-O.+  ; Default UefiCpuPkg Reset Vector locates 
> FSP-O as BFV. However the actual+  ; SEC core that launches PEI is part of another FV. We need to pass
> that FV+  ; as BFV to PEI core.+  ;+  mov     r8, ASM_PFX (PcdGet64
> (PcdFspWrapperBfvforResetVectorInFsp))+  mov     rcx, QWORD[r8]+  mov
> r8,  rcx++  ;+  ; Pass stack size into the PEI Core+  ;+  mov     rcx, r15  ; Start of
> TempRam+  mov     rdx, r14  ; End of TempRam++  sub     rcx, rdx  ; Size of
> TempRam++  ;+  ; Pass Control into the PEI Core+  ;+  sub     rsp, 20h+  call
> ASM_PFX(SecStartup)+diff --git
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> r
> mSecLib/X64/SecEntry.nasm
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> rmSecLib/X64/SecEntry.nasm
> new file mode 100644
> index 0000000000..de8ba83d52
> --- /dev/null
> +++
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlat
> +++ formSecLib/X64/SecEntry.nasm
> @@ -0,0 +1,71 @@
> +;--------------------------------------------------------------------
> +----------+;+;
> Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>+; 
> SPDX-License-
> Identifier: BSD-2-Clause-Patent+; Module Name:+;+;  SecEntry.nasm+;+; 
> Abstract:+;+;  This is the code that passes control to PEI 
> core.+;+;-----------------
> -------------------------------------------------------------++#includ
> -------------------------------------------------------------++e
> <Fsp.h>++SECTION .text++extern   ASM_PFX(CallPeiCoreEntryPoint)+extern
> ASM_PFX(FsptUpdDataPtr)+; Pcds+extern   ASM_PFX(PcdGet32
> (PcdFspTemporaryRamSize))++;------------------------------------------
> -------------
> ---------------------+;+; Procedure:    _ModuleEntryPoint+;+; Input:        None+;+;
> Output:       None+;+; Destroys:     Assume all registers+;+; Description:+;+;
> After TempRamInit done, pass control to PEI core.+;+; Return:       None+;+;
> MMX Usage:+;              MM0 = BIST State+;+;------------------------------------------
> ----------------------------------++BITS 64+align 16+global
> ASM_PFX(_ModuleEntryPoint)+ASM_PFX(_ModuleEntryPoint):+  push    rax+
> mov     rax, ASM_PFX(FsptUpdDataPtr)  ; This is dummy code to include
> TempRamInitParams in SecCore for FSP-O.+#if
> FixedPcdGet8(PcdFspModeSelection) == 1+  mov     rax, ASM_PFX(PcdGet32
> (PcdFspTemporaryRamSize))+  sub     edx, dword [rax]              ; TemporaryRam
> for FSP+#endif+  pop     rax++  mov     r8,  rdx+  mov     rdx, rcx+  xor     ecx, ecx
> ; zero - no Hob List Yet+  mov     rsp, r8++  ;+  ; Per X64 calling convention, make
> sure RSP is 16-byte aligned.+  ;+  mov     rax, rsp+  and     rax, 0fh+  sub     rsp,
> rax++  call    ASM_PFX(CallPeiCoreEntryPoint)++  jmp     $diff --git
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> r
> mSecLib/X64/Stack.nasm
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> rmSecLib/X64/Stack.nasm
> new file mode 100644
> index 0000000000..21010bf4ef
> --- /dev/null
> +++
> b/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlat
> +++ formSecLib/X64/Stack.nasm
> @@ -0,0 +1,72 @@
> +;--------------------------------------------------------------------
> +----------+;+;
> Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>+; SPDX-License-
> Identifier: BSD-2-Clause-Patent+; Abstract:+;+;   Switch the stack from
> temporary memory to permanent 
> memory.+;+;-------------------------------------
> -----------------------------------------++    SECTION 
> -----------------------------------------++ .text++;------------------
> -----------------------------------------++ ---------
> ---------------------------------------------------+; VOID+; EFIAPI+; 
> ---------------------------------------------------+SecSwitchStack
> (+;   UINT32   TemporaryMemoryBase,+;   UINT32   PermanentMemoryBase+;
> );+;------------------------------------------------------------------------------+global
> ASM_PFX(SecSwitchStack)+ASM_PFX(SecSwitchStack):+    ;+    ; Save four
> register: rax, rbx, rcx, rdx+    ;+    push  rax+    push  rbx+    push  rcx+    push
> rdx++    ;+    ; !!CAUTION!! this function address's is pushed into stack after+    ;
> migration of whole temporary memory, so need save it to permanent+    ;
> memory at first!+    ;++    mov   rbx, rcx                 ; Save the first parameter+
> mov   rcx, rdx                 ; Save the second parameter++    ;+    ; Save this
> function's return address into permanent memory at first.+    ; Then, Fixup the
> esp point to permanent memory+    ;+    mov   rax, rsp+    sub   rax, rbx+    add
> rax, rcx+    mov   rdx, qword [rsp]         ; copy pushed register's value to
> permanent memory+    mov   qword [rax], rdx+    mov   rdx, qword [rsp + 8]+
> mov   qword [rax + 8], rdx+    mov   rdx, qword [rsp + 16]+    mov   qword [rax +
> 16], rdx+    mov   rdx, qword [rsp + 24]+    mov   qword [rax + 24], rdx+    mov
> rdx, qword [rsp + 32]    ; Update this function's return address into permanent
> memory+    mov   qword [rax + 32], rdx+    mov   rsp, rax                 ; From now,
> rsp is pointed to permanent memory++    ;+    ; Fixup the rbp point to
> permanent memory+    ;+    mov   rax, rbp+    sub   rax, rbx+    add   rax, rcx+
> mov   rbp, rax                 ; From now, rbp is pointed to permanent memory++
> pop   rdx+    pop   rcx+    pop   rbx+    pop   rax+    ret+diff --git
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> r mSecLib/Ia32/Fsp.h b/Platform/Intel/MinPlatformPkg/Include/Fsp.h
> similarity index 79%
> rename from
> Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatform
> SecLib/Ia32/Fsp.h
> rename to Platform/Intel/MinPlatformPkg/Include/Fsp.h
> index 9f6cdcf476..319e1e3372 100644
> ---
> a/Platform/Intel/MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatfo
> r
> mSecLib/Ia32/Fsp.h
> +++ b/Platform/Intel/MinPlatformPkg/Include/Fsp.h
> @@ -1,7 +1,7 @@
>  /** @file   Fsp related definitions -Copyright (c) 2017, Intel Corporation. All
> rights reserved.<BR>+Copyright (c) 2017 - 2024, Intel Corporation. All 
> rights reserved.<BR> SPDX-License-Identifier: BSD-2-Clause-Patent  
> **/@@ -36,7
> +36,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
>  // // Fsp Header //-#define FSP_HEADER_IMAGEBASE_OFFSET     0x1C-
> #define FSP_HEADER_TEMPRAMINIT_OFFSET   0x30+#define
> FSP_HEADER_IMAGEBASE_OFFSET   0x1C+#define
> FSP_HEADER_TEMPRAMINIT_OFFSET 0x30  #endifdiff --git 
> a/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dec
> b/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dec
> index a14c6b2db5..12f86585ad 100644
> --- a/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dec
> +++ b/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dec
> @@ -6,7 +6,7 @@
>  # INF files to generate AutoGen.c and AutoGen.h files # for the build 
> infrastructure. #-# Copyright (c) 2017 - 2021, Intel Corporation. All 
> rights reserved.<BR>+# Copyright (c) 2017 - 2024, Intel Corporation. 
> All rights reserved.<BR> # Copyright (C) 2023 Advanced Micro Devices, 
> Inc. All rights reserved.<BR> # # SPDX-License-Identifier: 
> BSD-2-Clause-Patent@@ -393,6
> +393,21 @@
>    #
> gMinPlatformPkgTokenSpaceGuid.PcdFspDispatchModeUseFspPeiMain|TRUE
> |BOOLEAN|0xF00000A8 +  ## BFV Location for Reset Vector in FSP+  # The
> default of BFV Location for Reset Vector in FSP is 
> 0x00000000FFFF0000.+  #+ 
> gMinPlatformPkgTokenSpaceGuid.PcdFspWrapperBfvforResetVectorInFsp|0x
> 00000000FFFF0000|UINT64|0xF00000A9++  ## FSP-T UPD Header
> Revision+  # The default of FSP-T UPD Header Revision is 0.+  #+
> gMinPlatformPkgTokenSpaceGuid.PcdFsptUpdHeaderRevision|0x0|UINT8|0x
> F00000AA++  ## FSP-T ARCH UPD Revision+  # The default of FSP-T ARCH 
> F00000AA++ UPD
> Revision is 0.+  #+
> gMinPlatformPkgTokenSpaceGuid.PcdFsptArchUpdRevision|0x0|UINT8|0xF0
> 0000AC+ [PcdsFeatureFlag]
> gMinPlatformPkgTokenSpaceGuid.PcdStopAfterDebugInit
> |FALSE|BOOLEAN|0xF00000A1--
> 2.40.1.windows.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#114764): https://edk2.groups.io/g/devel/message/114764
Mute This Topic: https://groups.io/mt/103478590/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-



^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2024-01-30  7:51 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-01-02  9:40 [edk2-devel][edk2-platforms][PATCH v4] MinPlatformPkg: Support SecFspWrapperPlatformSecLib in X64 Kuo, Ted
2024-01-26  0:19 ` Chaganty, Rangasai V
2024-01-29 23:39 ` Nate DeSimone
2024-01-30  7:51   ` Kuo, Ted

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox