diff options
Diffstat (limited to 'src/VBox/Devices/EFI/Firmware/CryptoPkg/Driver/CryptoPei.c')
-rw-r--r-- | src/VBox/Devices/EFI/Firmware/CryptoPkg/Driver/CryptoPei.c | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/src/VBox/Devices/EFI/Firmware/CryptoPkg/Driver/CryptoPei.c b/src/VBox/Devices/EFI/Firmware/CryptoPkg/Driver/CryptoPei.c new file mode 100644 index 00000000..8973a1c6 --- /dev/null +++ b/src/VBox/Devices/EFI/Firmware/CryptoPkg/Driver/CryptoPei.c @@ -0,0 +1,99 @@ +/** @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; +} |