/** @file\r
\r
- Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>\r
- This program and the accompanying materials\r
- are licensed and made available under the terms and conditions of the BSD License\r
- which accompanies this distribution. The full text of the license may be found at\r
- http://opensource.org/licenses/bsd-license.php.\r
-\r
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+ Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
#include "SecFsp.h"\r
\r
-UINT32 FspImageSizeOffset = FSP_INFO_HEADER_OFF + OFFSET_IN_FSP_INFO_HEADER(ImageSize);\r
-\r
/**\r
\r
Calculate the FSP IDT gate descriptor.\r
IA32_IDT_GATE_DESCRIPTOR *IdtGateDescriptor;\r
FSP_INFO_HEADER *FspInfoHeader;\r
\r
- FspInfoHeader = (FSP_INFO_HEADER *)(GetFspBaseAddress() + FSP_INFO_HEADER_OFF);\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
TopOfCar = PcdGet32 (PcdTemporaryRamBase) + PcdGet32 (PcdTemporaryRamSize);\r
\r
FspPlatformData->DataPtr = NULL;\r
- FspPlatformData->CodeRegionSize = 0;\r
+ FspPlatformData->MicrocodeRegionBase = 0;\r
+ FspPlatformData->MicrocodeRegionSize = 0;\r
FspPlatformData->CodeRegionBase = 0;\r
- FspPlatformData->MicorcodeRegionBase = 0;\r
- FspPlatformData->MicorcodeRegionSize = 0;\r
+ FspPlatformData->CodeRegionSize = 0;\r
\r
//\r
// Pointer to the size field\r
//\r
DwordSize = 4;\r
StackPtr = StackPtr - 1 - DwordSize;\r
- CopyMem (&(FspPlatformData->CodeRegionBase), StackPtr, (DwordSize << 2));\r
+ CopyMem (&(FspPlatformData->MicrocodeRegionBase), StackPtr, (DwordSize << 2));\r
StackPtr--;\r
} else if (*(StackPtr - 1) == FSP_PER0_SIGNATURE) {\r
//\r
It needs to be done as soon as possible after the stack is setup.\r
\r
@param[in,out] PeiFspData Pointer of the FSP global data.\r
- @param[in] BootFirmwareVolume Point to the address of BootFirmwareVolume in stack.\r
+ @param[in] BootLoaderStack BootLoader stack.\r
+ @param[in] ApiIdx The index of the FSP API.\r
\r
**/\r
VOID\r
FspGlobalDataInit (\r
IN OUT FSP_GLOBAL_DATA *PeiFspData,\r
- IN VOID **BootFirmwareVolume\r
+ IN UINT32 BootLoaderStack,\r
+ IN UINT8 ApiIdx\r
)\r
{\r
VOID *UpdDataRgnPtr;\r
ZeroMem ((VOID *)PeiFspData, sizeof(FSP_GLOBAL_DATA));\r
\r
PeiFspData->Signature = FSP_GLOBAL_DATA_SIGNATURE;\r
- PeiFspData->CoreStack = *(UINTN *)(BootFirmwareVolume + 2);\r
+ PeiFspData->CoreStack = BootLoaderStack;\r
PeiFspData->PerfIdx = 2;\r
\r
SetFspMeasurePoint (FSP_PERF_ID_API_FSPINIT_ENTRY);\r
// 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 *)(GetFspBaseAddress() + FSP_INFO_HEADER_OFF);\r
+ PeiFspData->FspInfoHeader = (FSP_INFO_HEADER *)AsmGetFspInfoHeader();\r
SecGetPlatformData (PeiFspData);\r
\r
+ //\r
+ // Set API calling mode\r
+ //\r
+ SetFspApiCallingMode (ApiIdx == 1 ? 0 : 1);\r
+\r
//\r
// Initialize UPD pointer.\r
//\r
}\r
ImageId[Idx] = 0;\r
\r
- DEBUG ((DEBUG_INFO | DEBUG_INIT, "\n============= PEIM FSP (%a 0x%08X) =============\n", \\r
- ImageId, PeiFspData->FspInfoHeader->ImageRevision));\r
+ DEBUG ((DEBUG_INFO | DEBUG_INIT, "\n============= PEIM FSP v1.%x (%a v%x.%x.%x.%x) =============\n", \\r
+ PeiFspData->FspInfoHeader->HeaderRevision - 1, \\r
+ ImageId, \\r
+ (PeiFspData->FspInfoHeader->ImageRevision >> 24) & 0xff, \\r
+ (PeiFspData->FspInfoHeader->ImageRevision >> 16) & 0xff, \\r
+ (PeiFspData->FspInfoHeader->ImageRevision >> 8) & 0xff, \\r
+ (PeiFspData->FspInfoHeader->ImageRevision >> 0) & 0xff));\r
\r
}\r
\r
This function check the FSP API calling condition.\r
\r
@param[in] ApiIdx Internal index of the FSP API.\r
+ @param[in] ApiParam Parameter of the FSP API.\r
\r
**/\r
EFI_STATUS\r
EFIAPI\r
FspApiCallingCheck (\r
- UINT32 ApiIdx\r
+ IN UINT32 ApiIdx,\r
+ IN VOID *ApiParam\r
)\r
{\r
- EFI_STATUS Status;\r
- FSP_GLOBAL_DATA *FspData;\r
+ EFI_STATUS Status;\r
+ FSP_GLOBAL_DATA *FspData;\r
+ FSP_INIT_PARAMS *FspInitParams;\r
+ FSP_INIT_RT_COMMON_BUFFER *FspRtBuffer;\r
+\r
+ FspInitParams = (FSP_INIT_PARAMS *) ApiParam;\r
+ FspRtBuffer = ((FSP_INIT_RT_COMMON_BUFFER *)FspInitParams->RtBufferPtr);\r
\r
Status = EFI_SUCCESS;\r
- FspData = GetFspGlobalDataPointer ();\r
+ FspData = GetFspGlobalDataPointer ();\r
if (ApiIdx == 1) {\r
//\r
// FspInit check\r
//\r
if ((UINT32)FspData != 0xFFFFFFFF) {\r
Status = EFI_UNSUPPORTED;\r
+ } else if ((FspRtBuffer == NULL) || ((FspRtBuffer->BootLoaderTolumSize % EFI_PAGE_SIZE) != 0) || (EFI_ERROR(FspUpdSignatureCheck(ApiIdx, ApiParam)))) {\r
+ Status = EFI_INVALID_PARAMETER;\r
}\r
} else if (ApiIdx == 2) {\r
//\r
Status = EFI_UNSUPPORTED;\r
}\r
}\r
+ } else if (ApiIdx == 3) {\r
+ //\r
+ // FspMemoryInit check\r
+ //\r
+ if ((UINT32)FspData != 0xFFFFFFFF) {\r
+ Status = EFI_UNSUPPORTED;\r
+ } else if ((FspRtBuffer == NULL) || ((FspRtBuffer->BootLoaderTolumSize % EFI_PAGE_SIZE) != 0) || (EFI_ERROR(FspUpdSignatureCheck(ApiIdx, ApiParam)))) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ }\r
+ } else if (ApiIdx == 4) {\r
+ //\r
+ // TempRamExit check\r
+ //\r
+ if ((FspData == NULL) || ((UINT32)FspData == 0xFFFFFFFF)) {\r
+ Status = EFI_UNSUPPORTED;\r
+ } else {\r
+ if (FspData->Signature != FSP_GLOBAL_DATA_SIGNATURE) {\r
+ Status = EFI_UNSUPPORTED;\r
+ }\r
+ }\r
+ } else if (ApiIdx == 5) {\r
+ //\r
+ // FspSiliconInit check\r
+ //\r
+ if ((FspData == NULL) || ((UINT32)FspData == 0xFFFFFFFF)) {\r
+ Status = EFI_UNSUPPORTED;\r
+ } else {\r
+ if (FspData->Signature != FSP_GLOBAL_DATA_SIGNATURE) {\r
+ Status = EFI_UNSUPPORTED;\r
+ } else if (EFI_ERROR(FspUpdSignatureCheck(ApiIdx, ApiParam))) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ }\r
+ }\r
} else {\r
Status = EFI_UNSUPPORTED;\r
}\r
\r
return Status;\r
}\r
+\r
+/**\r
+ This function gets the boot FV offset in FSP.\r
+ @return the boot firmware volumen offset inside FSP binary\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+GetBootFirmwareVolumeOffset (\r
+ VOID\r
+ )\r
+{ \r
+ return PcdGet32 (PcdFspBootFirmwareVolumeBase) - PcdGet32 (PcdFspAreaBaseAddress);\r
+}\r