diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 16:49:04 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 16:49:04 +0000 |
commit | 16f504a9dca3fe3b70568f67b7d41241ae485288 (patch) | |
tree | c60f36ada0496ba928b7161059ba5ab1ab224f9d /src/VBox/Devices/EFI/Firmware/CryptoPkg/Driver/CryptoPei.c | |
parent | Initial commit. (diff) | |
download | virtualbox-upstream.tar.xz virtualbox-upstream.zip |
Adding upstream version 7.0.6-dfsg.upstream/7.0.6-dfsgupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
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; +} |