From 26638d2aa399e436f47d629f877e581ed402020a Mon Sep 17 00:00:00 2001 From: Chasel Chiu Date: Tue, 25 Oct 2022 11:43:49 -0700 Subject: IntelFsp2WrapperPkg: Check header revision for MultiPhase support. REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4119 Earlier version of FSP header may not have MultiPhase fields present in the FspInfoHeader so the handler should verify header revision before accessing the MultiPhase fields from the header. Cc: Nate DeSimone Cc: Star Zeng Signed-off-by: Chasel Chiu Reviewed-by: Nate DeSimone --- .../PeiFspWrapperMultiPhaseProcessLib.c | 38 ++++++++++++++++------ 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/IntelFsp2WrapperPkg/Library/FspWrapperMultiPhaseProcessLib/PeiFspWrapperMultiPhaseProcessLib.c b/IntelFsp2WrapperPkg/Library/FspWrapperMultiPhaseProcessLib/PeiFspWrapperMultiPhaseProcessLib.c index 1248accf87..834dca07a9 100644 --- a/IntelFsp2WrapperPkg/Library/FspWrapperMultiPhaseProcessLib/PeiFspWrapperMultiPhaseProcessLib.c +++ b/IntelFsp2WrapperPkg/Library/FspWrapperMultiPhaseProcessLib/PeiFspWrapperMultiPhaseProcessLib.c @@ -73,15 +73,27 @@ CallFspMultiPhaseEntry ( // // FSP_MULTI_PHASE_INIT and FSP_MULTI_PHASE_SI_INIT API functions having same prototype. // - UINTN FspMultiPhaseApiEntry; - UINTN FspMultiPhaseApiOffset; - EFI_STATUS Status; - BOOLEAN InterruptState; + UINTN FspMultiPhaseApiEntry; + UINTN FspMultiPhaseApiOffset; + EFI_STATUS Status; + BOOLEAN InterruptState; + BOOLEAN IsVariableServiceRequest; + FSP_MULTI_PHASE_PARAMS *FspMultiPhaseParamsPtr; + + FspMultiPhaseParamsPtr = (FSP_MULTI_PHASE_PARAMS *)FspMultiPhaseParams; + IsVariableServiceRequest = FALSE; + if ((FspMultiPhaseParamsPtr->MultiPhaseAction == EnumMultiPhaseGetVariableRequestInfo) || + (FspMultiPhaseParamsPtr->MultiPhaseAction == EnumMultiPhaseCompleteVariableRequest)) + { + IsVariableServiceRequest = TRUE; + } if (ComponentIndex == FspMultiPhaseMemInitApiIndex) { FspHeader = (FSP_INFO_HEADER *)FspFindFspHeader (PcdGet32 (PcdFspmBaseAddress)); if (FspHeader == NULL) { return EFI_DEVICE_ERROR; + } else if (FspHeader->SpecVersion < 0x24) { + return EFI_UNSUPPORTED; } FspMultiPhaseApiOffset = FspHeader->FspMultiPhaseMemInitEntryOffset; @@ -89,6 +101,10 @@ CallFspMultiPhaseEntry ( FspHeader = (FSP_INFO_HEADER *)FspFindFspHeader (PcdGet32 (PcdFspsBaseAddress)); if (FspHeader == NULL) { return EFI_DEVICE_ERROR; + } else if (FspHeader->SpecVersion < 0x22) { + return EFI_UNSUPPORTED; + } else if ((FspHeader->SpecVersion < 0x24) && (IsVariableServiceRequest == TRUE)) { + return EFI_UNSUPPORTED; } FspMultiPhaseApiOffset = FspHeader->FspMultiPhaseSiInitEntryOffset; @@ -117,10 +133,11 @@ CallFspMultiPhaseEntry ( /** FSP Wrapper Variable Request Handler - @param[in] FspHobListPtr - Pointer to FSP HobList (valid after FSP-M completed) - @param[in] ComponentIndex - FSP Component which executing MultiPhase initialization. + @param[in, out] FspHobListPtr - Pointer to FSP HobList (valid after FSP-M completed) + @param[in] ComponentIndex - FSP Component which executing MultiPhase initialization. - @retval EFI_UNSUPPORTED FSP Wrapper cannot support the specific variable request + @retval EFI_UNSUPPORTED FSP Wrapper cannot support the specific variable request, + or FSP does not support VariableService @retval EFI_STATUS Return FSP returned status **/ @@ -284,10 +301,11 @@ FspWrapperVariableRequestHandler ( /** FSP Wrapper MultiPhase Handler - @param[in] FspHobListPtr - Pointer to FSP HobList (valid after FSP-M completed) - @param[in] ComponentIndex - FSP Component which executing MultiPhase initialization. + @param[in, out] FspHobListPtr - Pointer to FSP HobList (valid after FSP-M completed) + @param[in] ComponentIndex - FSP Component which executing MultiPhase initialization. - @retval EFI_STATUS Always return EFI_SUCCESS + @retval EFI_UNSUPPORTED Specific MultiPhase action was not supported. + @retval EFI_SUCCESS MultiPhase action were completed successfully. **/ EFI_STATUS -- cgit v1.2.3