blob: e538aa42184bae77f8dca85c1fa8a9a196d9d8e3 [file] [log] [blame]
/** @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;
}