2 Installs the EDK II Crypto PPI. If this PEIM is dispatched before memory is
3 discovered, the RegisterForShadow() feature is used to reload this PEIM into
4 memory after memory is discovered.
6 Copyright (C) Microsoft Corporation. All rights reserved.
7 SPDX-License-Identifier: BSD-2-Clause-Patent
12 #include <Library/PeiServicesLib.h>
13 #include <Library/DebugLib.h>
14 #include <Ppi/Crypto.h>
16 extern CONST EDKII_CRYPTO_PROTOCOL mEdkiiCrypto
;
18 CONST EFI_PEI_PPI_DESCRIPTOR mEdkiiCryptoPpiList
= {
19 (EFI_PEI_PPI_DESCRIPTOR_PPI
| EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST
),
21 (EDKII_CRYPTO_PPI
*)&mEdkiiCrypto
25 Entry to CryptoPeiEntry.
27 @param FileHandle The image handle.
28 @param PeiServices The PEI services table.
30 @retval Status From internal routine or boot object, should not fail
35 IN EFI_PEI_FILE_HANDLE FileHandle
,
36 IN CONST EFI_PEI_SERVICES
**PeiServices
40 VOID
*MemoryDiscoveredPpi
;
41 EDKII_CRYPTO_PPI
*EdkiiCryptoPpi
;
42 EFI_PEI_PPI_DESCRIPTOR
*EdkiiCryptoPpiDescriptor
;
45 // Not all Open SSL services support XIP due to use of global variables.
46 // Use gEfiPeiMemoryDiscoveredPpiGuid to detect Pre-Mem and Post-Mem and
47 // always shadow this module in memory in Post-Mem.
49 Status
= PeiServicesLocatePpi (
50 &gEfiPeiMemoryDiscoveredPpiGuid
,
53 (VOID
**)&MemoryDiscoveredPpi
55 if (Status
== EFI_NOT_FOUND
) {
57 // CryptoPei is dispatched before gEfiPeiMemoryDiscoveredPpiGuid
59 Status
= PeiServicesRegisterForShadow (FileHandle
);
60 ASSERT_EFI_ERROR (Status
);
61 if (!EFI_ERROR (Status
)) {
63 // First CryptoPpi installation. CryptoPei could come from memory or flash
64 // it will be re-installed after gEfiPeiMemoryDiscoveredPpiGuid
66 DEBUG ((DEBUG_INFO
, "CryptoPeiEntry: Install Pre-Memory Crypto PPI\n"));
67 Status
= PeiServicesInstallPpi (&mEdkiiCryptoPpiList
);
68 ASSERT_EFI_ERROR (Status
);
70 } else if (Status
== EFI_SUCCESS
) {
72 // CryptoPei is dispatched after gEfiPeiMemoryDiscoveredPpiGuid
74 Status
= PeiServicesLocatePpi (
77 &EdkiiCryptoPpiDescriptor
,
78 (VOID
**)&EdkiiCryptoPpi
80 if (!EFI_ERROR (Status
)) {
82 // CryptoPei was also dispatched before gEfiPeiMemoryDiscoveredPpiGuid
84 DEBUG ((DEBUG_INFO
, "CryptoPeiEntry: ReInstall Post-Memmory Crypto PPI\n"));
85 Status
= PeiServicesReInstallPpi (
86 EdkiiCryptoPpiDescriptor
,
89 ASSERT_EFI_ERROR (Status
);
91 DEBUG ((DEBUG_INFO
, "CryptoPeiEntry: Install Post-Memmory Crypto PPI\n"));
92 Status
= PeiServicesInstallPpi (&mEdkiiCryptoPpiList
);
95 ASSERT_EFI_ERROR (Status
);