]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFsp2Pkg/FspSecCore/SecFsp.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / IntelFsp2Pkg / FspSecCore / SecFsp.c
index 446d1730e958ce09feab37641d264e1107e37a1f..11be1f97ca1560965bfa04f4c30059f84d5b3298 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 \r
-  Copyright (c) 2014 - 2019, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2014 - 2022, Intel Corporation. All rights reserved.<BR>\r
   SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
   @return                     FSP specific IDT gate descriptor.\r
 \r
 **/\r
-UINT64\r
-FspGetExceptionHandler(\r
+IA32_IDT_GATE_DESCRIPTOR\r
+FspGetExceptionHandler (\r
   IN  UINT64  IdtEntryTemplate\r
   )\r
 {\r
   UINT32                    Entry;\r
-  UINT64                    ExceptionHandler;\r
-  IA32_IDT_GATE_DESCRIPTOR *IdtGateDescriptor;\r
-  FSP_INFO_HEADER          *FspInfoHeader;\r
-\r
-  FspInfoHeader     = (FSP_INFO_HEADER *)AsmGetFspInfoHeader();\r
-  ExceptionHandler  = IdtEntryTemplate;\r
-  IdtGateDescriptor = (IA32_IDT_GATE_DESCRIPTOR *)&ExceptionHandler;\r
-  Entry = (IdtGateDescriptor->Bits.OffsetHigh << 16) | IdtGateDescriptor->Bits.OffsetLow;\r
-  Entry = FspInfoHeader->ImageBase + FspInfoHeader->ImageSize - (~Entry + 1);\r
+  IA32_IDT_GATE_DESCRIPTOR  ExceptionHandler;\r
+  IA32_IDT_GATE_DESCRIPTOR  *IdtGateDescriptor;\r
+  FSP_INFO_HEADER           *FspInfoHeader;\r
+\r
+  ZeroMem ((VOID *)&ExceptionHandler, sizeof (IA32_IDT_GATE_DESCRIPTOR));\r
+  FspInfoHeader                      = (FSP_INFO_HEADER *)(UINTN)AsmGetFspInfoHeader ();\r
+  *(UINT64 *) &ExceptionHandler      = IdtEntryTemplate;\r
+  IdtGateDescriptor                  = &ExceptionHandler;\r
+  Entry                              = (IdtGateDescriptor->Bits.OffsetHigh << 16) | IdtGateDescriptor->Bits.OffsetLow;\r
+  Entry                              = FspInfoHeader->ImageBase + FspInfoHeader->ImageSize - (~Entry + 1);\r
   IdtGateDescriptor->Bits.OffsetHigh = (UINT16)(Entry >> 16);\r
   IdtGateDescriptor->Bits.OffsetLow  = (UINT16)Entry;\r
 \r
@@ -46,13 +47,13 @@ FspGetExceptionHandler(
 VOID\r
 EFIAPI\r
 SecGetPlatformData (\r
-  IN OUT  FSP_GLOBAL_DATA    *FspData\r
+  IN OUT  FSP_GLOBAL_DATA  *FspData\r
   )\r
 {\r
-  FSP_PLAT_DATA    *FspPlatformData;\r
-  UINT32            TopOfCar;\r
-  UINT32           *StackPtr;\r
-  UINT32            DwordSize;\r
+  FSP_PLAT_DATA  *FspPlatformData;\r
+  UINT32         TopOfCar;\r
+  UINT32         *StackPtr;\r
+  UINT32         DwordSize;\r
 \r
   FspPlatformData = &FspData->PlatformData;\r
 \r
@@ -61,7 +62,7 @@ SecGetPlatformData (
   // reside in the bottom of stack, left untouched by normal stack operation.\r
   //\r
 \r
-  FspPlatformData->DataPtr   = NULL;\r
+  FspPlatformData->DataPtr             = NULL;\r
   FspPlatformData->MicrocodeRegionBase = 0;\r
   FspPlatformData->MicrocodeRegionSize = 0;\r
   FspPlatformData->CodeRegionBase      = 0;\r
@@ -70,7 +71,7 @@ SecGetPlatformData (
   //\r
   // Pointer to the size field\r
   //\r
-  TopOfCar = PcdGet32(PcdTemporaryRamBase) + PcdGet32(PcdTemporaryRamSize);\r
+  TopOfCar = PcdGet32 (PcdTemporaryRamBase) + PcdGet32 (PcdTemporaryRamSize);\r
   StackPtr = (UINT32 *)(TopOfCar - sizeof (UINT32));\r
 \r
   if (*(StackPtr - 1) == FSP_MCUD_SIGNATURE) {\r
@@ -114,26 +115,30 @@ SecGetPlatformData (
 **/\r
 VOID\r
 FspGlobalDataInit (\r
-  IN OUT  FSP_GLOBAL_DATA    *PeiFspData,\r
-  IN UINT32                   BootLoaderStack,\r
-  IN UINT8                    ApiIdx\r
+  IN OUT  FSP_GLOBAL_DATA  *PeiFspData,\r
+  IN UINTN                 BootLoaderStack,\r
+  IN UINT8                 ApiIdx\r
   )\r
 {\r
-  VOID              *FspmUpdDataPtr;\r
-  CHAR8              ImageId[9];\r
-  UINTN              Idx;\r
+  VOID   *FspmUpdDataPtr;\r
+  CHAR8  ImageId[9];\r
+  UINTN  Idx;\r
 \r
   //\r
   // Set FSP Global Data pointer\r
   //\r
-  SetFspGlobalDataPointer    (PeiFspData);\r
-  ZeroMem  ((VOID *)PeiFspData, sizeof(FSP_GLOBAL_DATA));\r
+  SetFspGlobalDataPointer (PeiFspData);\r
+  ZeroMem ((VOID *)PeiFspData, sizeof (FSP_GLOBAL_DATA));\r
 \r
-  PeiFspData->Signature            = FSP_GLOBAL_DATA_SIGNATURE;\r
-  PeiFspData->Version              = 0;\r
-  PeiFspData->CoreStack            = BootLoaderStack;\r
-  PeiFspData->PerfIdx              = 2;\r
-  PeiFspData->PerfSig              = FSP_PERFORMANCE_DATA_SIGNATURE;\r
+  PeiFspData->Signature = FSP_GLOBAL_DATA_SIGNATURE;\r
+  PeiFspData->Version   = FSP_GLOBAL_DATA_VERSION;\r
+  PeiFspData->CoreStack = BootLoaderStack;\r
+  PeiFspData->PerfIdx   = 2;\r
+  PeiFspData->PerfSig   = FSP_PERFORMANCE_DATA_SIGNATURE;\r
+  //\r
+  // Cache FspHobList pointer passed by bootloader via ApiParameter2\r
+  //\r
+  PeiFspData->FspHobListPtr = (VOID **)GetFspApiParameter2 ();\r
 \r
   SetFspMeasurePoint (FSP_PERF_ID_API_FSP_MEMORY_INIT_ENTRY);\r
 \r
@@ -141,7 +146,7 @@ FspGlobalDataInit (
   // Get FSP Header offset\r
   // It may have multiple FVs, so look into the last one for FSP header\r
   //\r
-  PeiFspData->FspInfoHeader      = (FSP_INFO_HEADER *)AsmGetFspInfoHeader();\r
+  PeiFspData->FspInfoHeader = (FSP_INFO_HEADER *)(UINTN)AsmGetFspInfoHeader ();\r
   SecGetPlatformData (PeiFspData);\r
 \r
   //\r
@@ -152,14 +157,25 @@ FspGlobalDataInit (
   //\r
   // Set UPD pointer\r
   //\r
-  FspmUpdDataPtr = (VOID *) GetFspApiParameter ();\r
+  FspmUpdDataPtr = (VOID *)GetFspApiParameter ();\r
   if (FspmUpdDataPtr == NULL) {\r
-    FspmUpdDataPtr = (VOID *)(PeiFspData->FspInfoHeader->ImageBase + PeiFspData->FspInfoHeader->CfgRegionOffset);\r
+    FspmUpdDataPtr = (VOID *)(UINTN)(PeiFspData->FspInfoHeader->ImageBase + PeiFspData->FspInfoHeader->CfgRegionOffset);\r
   }\r
+\r
   SetFspUpdDataPointer (FspmUpdDataPtr);\r
   SetFspMemoryInitUpdDataPointer (FspmUpdDataPtr);\r
   SetFspSiliconInitUpdDataPointer (NULL);\r
 \r
+  //\r
+  // Initialize OnSeparateStack value.\r
+  //\r
+  if (PcdGet8 (PcdFspHeapSizePercentage) != 0) {\r
+    //\r
+    // FSP is running on its own stack and may need switching stack when calling bootloader functions.\r
+    //\r
+    GetFspGlobalDataPointer ()->OnSeparateStack = 1;\r
+  }\r
+\r
   //\r
   // Initialize serial port\r
   // It might have been done in ProcessLibraryConstructorList(), however,\r
@@ -176,17 +192,25 @@ FspGlobalDataInit (
   for (Idx = 0; Idx < 8; Idx++) {\r
     ImageId[Idx] = PeiFspData->FspInfoHeader->ImageId[Idx];\r
   }\r
+\r
   ImageId[Idx] = 0;\r
 \r
-  DEBUG ((DEBUG_INFO | DEBUG_INIT, "\n============= FSP Spec v%d.%d Header Revision v%x (%a v%x.%x.%x.%x) =============\n", \\r
-         (PeiFspData->FspInfoHeader->SpecVersion >> 4) & 0xF, \\r
-         PeiFspData->FspInfoHeader->SpecVersion & 0xF, \\r
-         PeiFspData->FspInfoHeader->HeaderRevision, \\r
-         ImageId, \\r
-         (PeiFspData->FspInfoHeader->ImageRevision >> 24) & 0xFF, \\r
-         (PeiFspData->FspInfoHeader->ImageRevision >> 16) & 0xFF, \\r
-         (PeiFspData->FspInfoHeader->ImageRevision >> 8) & 0xFF, \\r
-         PeiFspData->FspInfoHeader->ImageRevision & 0xFF));\r
+  DEBUG ((\r
+    DEBUG_INFO | DEBUG_INIT,\r
+    "\n============= FSP Spec v%d.%d Header Revision v%x (%a v%x.%x.%x.%x) =============\n", \\r
+    (PeiFspData->FspInfoHeader->SpecVersion >> 4) & 0xF, \\r
+    PeiFspData->FspInfoHeader->SpecVersion & 0xF, \\r
+    PeiFspData->FspInfoHeader->HeaderRevision, \\r
+    ImageId, \\r
+    (PeiFspData->FspInfoHeader->ImageRevision >> 24) & 0xFF, \\r
+    (PeiFspData->FspInfoHeader->ImageRevision >> 16) & 0xFF, \\r
+    (PeiFspData->FspInfoHeader->HeaderRevision >= 6) ? \\r
+    (((PeiFspData->FspInfoHeader->ImageRevision >> 8) & 0xFF) | (PeiFspData->FspInfoHeader->ExtendedImageRevision & 0xFF00)) : \\r
+    ((PeiFspData->FspInfoHeader->ImageRevision >> 8) & 0xFF), \\r
+    (PeiFspData->FspInfoHeader->HeaderRevision >= 6) ? \\r
+    ((PeiFspData->FspInfoHeader->ImageRevision & 0xFF) | ((PeiFspData->FspInfoHeader->ExtendedImageRevision & 0xFF) << 8)) : \\r
+    (PeiFspData->FspInfoHeader->ImageRevision & 0xFF)\r
+    ));\r
 }\r
 \r
 /**\r
@@ -198,11 +222,11 @@ FspGlobalDataInit (
 **/\r
 VOID\r
 FspDataPointerFixUp (\r
-  IN UINT32   OffsetGap\r
+  IN UINTN  OffsetGap\r
   )\r
 {\r
   FSP_GLOBAL_DATA  *NewFspData;\r
 \r
-  NewFspData = (FSP_GLOBAL_DATA *)((UINTN)GetFspGlobalDataPointer() + (UINTN)OffsetGap);\r
+  NewFspData = (FSP_GLOBAL_DATA *)((UINTN)GetFspGlobalDataPointer () + (UINTN)OffsetGap);\r
   SetFspGlobalDataPointer (NewFspData);\r
 }\r