diff --git a/MdeModulePkg/Universal/Variable/Pei/Variable.c b/MdeModulePkg/Universal/Variable/Pei/Variable.c index e2a79a0fb3..a8132d6eaa 100644 --- a/MdeModulePkg/Universal/Variable/Pei/Variable.c +++ b/MdeModulePkg/Universal/Variable/Pei/Variable.c @@ -38,8 +38,8 @@ EFI_GUID mEfiVariableIndexTableGuid = EFI_VARIABLE_INDEX_TABLE_GUID; /** Provide the functionality of the variable services. - @param FileHandle Handle of the file being invoked. - Type EFI_PEI_FILE_HANDLE is defined in FfsFindNextFile(). + @param FileHandle Handle of the file being invoked. + Type EFI_PEI_FILE_HANDLE is defined in FfsFindNextFile(). @param PeiServices General purpose services available to every PEIM. @retval EFI_SUCCESS If the interface could be successfully installed @@ -53,9 +53,21 @@ PeimInitializeVariableServices ( IN CONST EFI_PEI_SERVICES **PeiServices ) { + EFI_BOOT_MODE BootMode; + EFI_STATUS Status; + // - // Publish the variable capability to other modules - // + // Check if this is recovery boot path. If no, publish the variable access capability + // to other modules. If yes, the content of variable area is not reliable. Therefore, + // in this case we should not provide variable service to other pei modules. + // + Status = (*PeiServices)->GetBootMode (PeiServices, &BootMode); + ASSERT_EFI_ERROR (Status); + + if (BootMode == BOOT_IN_RECOVERY_MODE) { + return EFI_UNSUPPORTED; + } + return PeiServicesInstallPpi (&mPpiListVariable); }