]> git.proxmox.com Git - mirror_edk2.git/commitdiff
IntelFsp2Pkg: BaseFspCommonLib Support for X64
authorKuo, Ted <ted.kuo@intel.com>
Mon, 14 Mar 2022 04:22:38 +0000 (12:22 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Tue, 22 Mar 2022 07:56:09 +0000 (07:56 +0000)
REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3867
Add BaseFspCommonLib Support for X64.

Cc: Chasel Chiu <chasel.chiu@intel.com>
Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
Cc: Ashraf Ali S <ashraf.ali.s@intel.com>
Signed-off-by: Ted Kuo <ted.kuo@intel.com>
Reviewed-by: Chasel Chiu <chasel.chiu@intel.com>
IntelFsp2Pkg/FspSecCore/SecFsp.c
IntelFsp2Pkg/FspSecCore/SecFsp.h
IntelFsp2Pkg/Include/FspGlobalData.h
IntelFsp2Pkg/Include/Library/FspCommonLib.h
IntelFsp2Pkg/Library/BaseFspCommonLib/FspCommonLib.c

index f79d45900eefccba98b0084d5e89b4027b22c8db..68e588dd414a2dc77b83fce17ae29a30110ac7e5 100644 (file)
@@ -217,7 +217,7 @@ FspGlobalDataInit (
 **/\r
 VOID\r
 FspDataPointerFixUp (\r
-  IN UINT32  OffsetGap\r
+  IN UINTN  OffsetGap\r
   )\r
 {\r
   FSP_GLOBAL_DATA  *NewFspData;\r
index aacd32f7f7dcabee7d7782ccf9ad1d5f929c6fd8..7c9be85fe06e16c1230837a32be7f703934d621e 100644 (file)
@@ -61,7 +61,7 @@ FspGlobalDataInit (
 **/\r
 VOID\r
 FspDataPointerFixUp (\r
-  IN UINT32  OffsetGap\r
+  IN UINTN  OffsetGap\r
   );\r
 \r
 /**\r
index 71033121c4cba3919bf30ede42932ed12247e7c6..2b534075aee9a7cbbcacc87f9041cb490d9acbcb 100644 (file)
@@ -42,7 +42,7 @@ typedef struct  {
   UINT32             Signature;\r
   UINT8              Version;\r
   UINT8              Reserved1[3];\r
-  UINT32             CoreStack;\r
+  UINT             CoreStack;\r
   UINT32             StatusCode;\r
   UINT32             Reserved2[8];\r
   FSP_PLAT_DATA      PlatformData;\r
index c70039d9e873e4a6ad84bcaaf93f135b0a0c3189..b5e38568e2ccdca7afa904c73d19941e7bb56d3c 100644 (file)
@@ -38,7 +38,7 @@ GetFspGlobalDataPointer (
 \r
   @retval ApiParameter FSP API first parameter passed by the bootloader.\r
 **/\r
-UINT32\r
+UINTN\r
 EFIAPI\r
 GetFspApiParameter (\r
   VOID\r
@@ -49,7 +49,7 @@ GetFspApiParameter (
 \r
   @retval ApiParameter FSP API second parameter passed by the bootloader.\r
 **/\r
-UINT32\r
+UINTN\r
 EFIAPI\r
 GetFspApiParameter2 (\r
   VOID\r
@@ -87,7 +87,7 @@ SetFspApiParameter (
 VOID\r
 EFIAPI\r
 SetFspApiReturnStatus (\r
-  IN UINT32  ReturnStatus\r
+  IN UINTN  ReturnStatus\r
   );\r
 \r
 /**\r
index 8f8453915e3b43c29c281838d132d2ad63942cb9..cd10b63c95d35d1debbf3a718df835bab8d014bc 100644 (file)
@@ -30,21 +30,34 @@ typedef struct {
   UINT16    IdtrLimit;\r
   UINT32    IdtrBase;\r
   UINT16    Reserved;\r
-  UINT32    Edi;\r
-  UINT32    Esi;\r
-  UINT32    Ebp;\r
-  UINT32    Esp;\r
-  UINT32    Ebx;\r
-  UINT32    Edx;\r
-  UINT32    Ecx;\r
-  UINT32    Eax;\r
+  UINT32    Registers[8];   // General Purpose Registers: Edi, Esi, Ebp, Esp, Ebx, Edx, Ecx and Eax\r
   UINT16    Flags[2];\r
   UINT32    FspInfoHeader;\r
   UINT32    ApiRet;\r
   UINT32    ApiParam[2];\r
 } CONTEXT_STACK;\r
 \r
-#define CONTEXT_STACK_OFFSET(x)  (UINT32)&((CONTEXT_STACK *)(UINTN)0)->x\r
+//\r
+//   API return address           +0xB0\r
+//   push    API Parameter2       +0xA8\r
+//   push    API Parameter1       +0xA0\r
+//   push    FspInfoHeader        +0x98\r
+//   pushfq                       +0x90\r
+//   cli\r
+//   PUSHA_64                     +0x10\r
+//   sub     rsp, 16              +0x00\r
+//   sidt    [rsp]\r
+//\r
+typedef struct {\r
+  UINT64    Idtr[2];        // IDTR Limit - bit0:bi15, IDTR Base - bit16:bit79\r
+  UINT64    Registers[16];  // General Purpose Registers: RDI, RSI, RBP, RSP, RBX, RDX, RCX, RAX, and R15 to R8\r
+  UINT32    Flags[2];\r
+  UINT64    FspInfoHeader;\r
+  UINT64    ApiParam[2];\r
+  UINT64    ApiRet;         // 64bit stack format is different from the 32bit one due to x64 calling convention\r
+} CONTEXT_STACK_64;\r
+\r
+#define CONTEXT_STACK_OFFSET(x)  (sizeof(UINTN) == sizeof (UINT32) ? (UINTN)&((CONTEXT_STACK *)(UINTN)0)->x : (UINTN)&((CONTEXT_STACK_64 *)(UINTN)0)->x)\r
 \r
 #pragma pack()\r
 \r
@@ -85,7 +98,7 @@ GetFspGlobalDataPointer (
 \r
   @retval ApiParameter FSP API first parameter passed by the bootloader.\r
 **/\r
-UINT32\r
+UINTN\r
 EFIAPI\r
 GetFspApiParameter (\r
   VOID\r
@@ -94,7 +107,7 @@ GetFspApiParameter (
   FSP_GLOBAL_DATA  *FspData;\r
 \r
   FspData = GetFspGlobalDataPointer ();\r
-  return *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET (ApiParam[0]));\r
+  return *(UINTN *)(FspData->CoreStack + CONTEXT_STACK_OFFSET (ApiParam[0]));\r
 }\r
 \r
 /**\r
@@ -119,7 +132,7 @@ GetFspEntryStack (
 \r
   @retval ApiParameter FSP API second parameter passed by the bootloader.\r
 **/\r
-UINT32\r
+UINTN\r
 EFIAPI\r
 GetFspApiParameter2 (\r
   VOID\r
@@ -128,7 +141,7 @@ GetFspApiParameter2 (
   FSP_GLOBAL_DATA  *FspData;\r
 \r
   FspData = GetFspGlobalDataPointer ();\r
-  return *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET (ApiParam[1]));\r
+  return *(UINTN *)(FspData->CoreStack + CONTEXT_STACK_OFFSET (ApiParam[1]));\r
 }\r
 \r
 /**\r
@@ -145,8 +158,8 @@ SetFspApiParameter (
 {\r
   FSP_GLOBAL_DATA  *FspData;\r
 \r
-  FspData                                                                  = GetFspGlobalDataPointer ();\r
-  *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET (ApiParam)) = Value;\r
+  FspData                                                          = GetFspGlobalDataPointer ();\r
+  *(UINTN *)(FspData->CoreStack + CONTEXT_STACK_OFFSET (ApiParam)) = Value;\r
 }\r
 \r
 /**\r
@@ -158,13 +171,13 @@ SetFspApiParameter (
 VOID\r
 EFIAPI\r
 SetFspApiReturnStatus (\r
-  IN UINT32  ReturnStatus\r
+  IN UINTN  ReturnStatus\r
   )\r
 {\r
   FSP_GLOBAL_DATA  *FspData;\r
 \r
-  FspData                                                             = GetFspGlobalDataPointer ();\r
-  *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET (Eax)) = ReturnStatus;\r
+  FspData                                                              = GetFspGlobalDataPointer ();\r
+  *(UINTN *)(FspData->CoreStack + CONTEXT_STACK_OFFSET (Registers[7])) = ReturnStatus;\r
 }\r
 \r
 /**\r
@@ -180,19 +193,19 @@ SetFspCoreStackPointer (
   )\r
 {\r
   FSP_GLOBAL_DATA  *FspData;\r
-  UINT32           *OldStack;\r
-  UINT32           *NewStack;\r
+  UINT           *OldStack;\r
+  UINT           *NewStack;\r
   UINT32           StackContextLen;\r
 \r
   FspData         = GetFspGlobalDataPointer ();\r
-  StackContextLen = sizeof (CONTEXT_STACK) / sizeof (UINT32);\r
+  StackContextLen = sizeof(CONTEXT_STACK) / sizeof(UINTN);\r
 \r
   //\r
   // Reserve space for the ContinuationFunc two parameters\r
   //\r
-  OldStack           = (UINT32 *)FspData->CoreStack;\r
-  NewStack           = (UINT32 *)NewStackTop - StackContextLen - 2;\r
-  FspData->CoreStack = (UINT32)NewStack;\r
+  OldStack = (UINTN *)FspData->CoreStack;\r
+  NewStack = (UINTN *)NewStackTop - StackContextLen - 2;\r
+  FspData->CoreStack = (UINTN)NewStack;\r
   while (StackContextLen-- != 0) {\r
     *NewStack++ = *OldStack++;\r
   }\r
@@ -427,7 +440,7 @@ GetFspInfoHeaderFromApiContext (
   FSP_GLOBAL_DATA  *FspData;\r
 \r
   FspData = GetFspGlobalDataPointer ();\r
-  return (FSP_INFO_HEADER *)(*(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET (FspInfoHeader)));\r
+  return (FSP_INFO_HEADER *)(*(UINTN *)(FspData->CoreStack + CONTEXT_STACK_OFFSET (FspInfoHeader)));\r
 }\r
 \r
 /**\r
@@ -444,7 +457,7 @@ GetFspCfgRegionDataPointer (
   FSP_INFO_HEADER  *FspInfoHeader;\r
 \r
   FspInfoHeader = GetFspInfoHeader ();\r
-  return (VOID *)(FspInfoHeader->ImageBase + FspInfoHeader->CfgRegionOffset);\r
+  return (VOID *)(UINTN)(FspInfoHeader->ImageBase + FspInfoHeader->CfgRegionOffset);\r
 }\r
 \r
 /**\r