mirror of https://github.com/acidanthera/audk.git
100 lines
3.1 KiB
C
100 lines
3.1 KiB
C
|
/** @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;
|
||
|
}
|