/** @file | |
Installs the EDK II Crypto PPI. If this PEIM is dispatched before memory is | |
discovered, the RegisterForShadow() feature is used to reload this PEIM into | |
memory after memory is discovered. | |
Copyright (C) Microsoft Corporation. All rights reserved. | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#include <PiPei.h> | |
#include <Library/PeiServicesLib.h> | |
#include <Library/DebugLib.h> | |
#include <Ppi/Crypto.h> | |
extern CONST EDKII_CRYPTO_PROTOCOL mEdkiiCrypto; | |
CONST EFI_PEI_PPI_DESCRIPTOR mEdkiiCryptoPpiList = { | |
(EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), | |
&gEdkiiCryptoPpiGuid, | |
(EDKII_CRYPTO_PPI *)&mEdkiiCrypto | |
}; | |
/** | |
Entry to CryptoPeiEntry. | |
@param FileHandle The image handle. | |
@param PeiServices The PEI services table. | |
@retval Status From internal routine or boot object, should not fail | |
**/ | |
EFI_STATUS | |
EFIAPI | |
CryptoPeiEntry ( | |
IN EFI_PEI_FILE_HANDLE FileHandle, | |
IN CONST EFI_PEI_SERVICES **PeiServices | |
) | |
{ | |
EFI_STATUS Status; | |
VOID *MemoryDiscoveredPpi; | |
EDKII_CRYPTO_PPI *EdkiiCryptoPpi; | |
EFI_PEI_PPI_DESCRIPTOR *EdkiiCryptoPpiDescriptor; | |
// | |
// Not all Open SSL services support XIP due to use of global variables. | |
// Use gEfiPeiMemoryDiscoveredPpiGuid to detect Pre-Mem and Post-Mem and | |
// always shadow this module in memory in Post-Mem. | |
// | |
Status = PeiServicesLocatePpi ( | |
&gEfiPeiMemoryDiscoveredPpiGuid, | |
0, | |
NULL, | |
(VOID **)&MemoryDiscoveredPpi | |
); | |
if (Status == EFI_NOT_FOUND) { | |
// | |
// CryptoPei is dispatched before gEfiPeiMemoryDiscoveredPpiGuid | |
// | |
Status = PeiServicesRegisterForShadow (FileHandle); | |
ASSERT_EFI_ERROR (Status); | |
if (!EFI_ERROR (Status)) { | |
// | |
// First CryptoPpi installation. CryptoPei could come from memory or flash | |
// it will be re-installed after gEfiPeiMemoryDiscoveredPpiGuid | |
// | |
DEBUG ((DEBUG_INFO, "CryptoPeiEntry: Install Pre-Memory Crypto PPI\n")); | |
Status = PeiServicesInstallPpi (&mEdkiiCryptoPpiList); | |
ASSERT_EFI_ERROR (Status); | |
} | |
} else if (Status == EFI_SUCCESS) { | |
// | |
// CryptoPei is dispatched after gEfiPeiMemoryDiscoveredPpiGuid | |
// | |
Status = PeiServicesLocatePpi ( | |
&gEdkiiCryptoPpiGuid, | |
0, | |
&EdkiiCryptoPpiDescriptor, | |
(VOID **)&EdkiiCryptoPpi | |
); | |
if (!EFI_ERROR (Status)) { | |
// | |
// CryptoPei was also dispatched before gEfiPeiMemoryDiscoveredPpiGuid | |
// | |
DEBUG ((DEBUG_INFO, "CryptoPeiEntry: ReInstall Post-Memmory Crypto PPI\n")); | |
Status = PeiServicesReInstallPpi ( | |
EdkiiCryptoPpiDescriptor, | |
&mEdkiiCryptoPpiList | |
); | |
ASSERT_EFI_ERROR (Status); | |
} else { | |
DEBUG ((DEBUG_INFO, "CryptoPeiEntry: Install Post-Memmory Crypto PPI\n")); | |
Status = PeiServicesInstallPpi (&mEdkiiCryptoPpiList); | |
} | |
} else { | |
ASSERT_EFI_ERROR (Status); | |
} | |
return Status; | |
} |