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
\r
@retval ApiParameter FSP API first parameter passed by the bootloader.\r
**/\r
-UINT32\r
+UINTN\r
EFIAPI\r
GetFspApiParameter (\r
VOID\r
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
\r
@retval ApiParameter FSP API second parameter passed by the bootloader.\r
**/\r
-UINT32\r
+UINTN\r
EFIAPI\r
GetFspApiParameter2 (\r
VOID\r
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
{\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
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
)\r
{\r
FSP_GLOBAL_DATA *FspData;\r
- UINT32 *OldStack;\r
- UINT32 *NewStack;\r
+ UINTN *OldStack;\r
+ UINTN *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
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
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