CryptoPei.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /** @file
  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.
  5. Copyright (C) Microsoft Corporation. All rights reserved.
  6. SPDX-License-Identifier: BSD-2-Clause-Patent
  7. **/
  8. #include <PiPei.h>
  9. #include <Library/PeiServicesLib.h>
  10. #include <Library/DebugLib.h>
  11. #include <Ppi/Crypto.h>
  12. extern CONST EDKII_CRYPTO_PROTOCOL mEdkiiCrypto;
  13. CONST EFI_PEI_PPI_DESCRIPTOR mEdkiiCryptoPpiList = {
  14. (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
  15. &gEdkiiCryptoPpiGuid,
  16. (EDKII_CRYPTO_PPI *)&mEdkiiCrypto
  17. };
  18. /**
  19. Entry to CryptoPeiEntry.
  20. @param FileHandle The image handle.
  21. @param PeiServices The PEI services table.
  22. @retval Status From internal routine or boot object, should not fail
  23. **/
  24. EFI_STATUS
  25. EFIAPI
  26. CryptoPeiEntry (
  27. IN EFI_PEI_FILE_HANDLE FileHandle,
  28. IN CONST EFI_PEI_SERVICES **PeiServices
  29. )
  30. {
  31. EFI_STATUS Status;
  32. VOID *MemoryDiscoveredPpi;
  33. EDKII_CRYPTO_PPI *EdkiiCryptoPpi;
  34. EFI_PEI_PPI_DESCRIPTOR *EdkiiCryptoPpiDescriptor;
  35. //
  36. // Not all Open SSL services support XIP due to use of global variables.
  37. // Use gEfiPeiMemoryDiscoveredPpiGuid to detect Pre-Mem and Post-Mem and
  38. // always shadow this module in memory in Post-Mem.
  39. //
  40. Status = PeiServicesLocatePpi (
  41. &gEfiPeiMemoryDiscoveredPpiGuid,
  42. 0,
  43. NULL,
  44. (VOID **)&MemoryDiscoveredPpi
  45. );
  46. if (Status == EFI_NOT_FOUND) {
  47. //
  48. // CryptoPei is dispatched before gEfiPeiMemoryDiscoveredPpiGuid
  49. //
  50. Status = PeiServicesRegisterForShadow (FileHandle);
  51. ASSERT_EFI_ERROR (Status);
  52. if (!EFI_ERROR (Status)) {
  53. //
  54. // First CryptoPpi installation. CryptoPei could come from memory or flash
  55. // it will be re-installed after gEfiPeiMemoryDiscoveredPpiGuid
  56. //
  57. DEBUG ((DEBUG_INFO, "CryptoPeiEntry: Install Pre-Memory Crypto PPI\n"));
  58. Status = PeiServicesInstallPpi (&mEdkiiCryptoPpiList);
  59. ASSERT_EFI_ERROR (Status);
  60. }
  61. } else if (Status == EFI_SUCCESS) {
  62. //
  63. // CryptoPei is dispatched after gEfiPeiMemoryDiscoveredPpiGuid
  64. //
  65. Status = PeiServicesLocatePpi (
  66. &gEdkiiCryptoPpiGuid,
  67. 0,
  68. &EdkiiCryptoPpiDescriptor,
  69. (VOID **)&EdkiiCryptoPpi
  70. );
  71. if (!EFI_ERROR (Status)) {
  72. //
  73. // CryptoPei was also dispatched before gEfiPeiMemoryDiscoveredPpiGuid
  74. //
  75. DEBUG ((DEBUG_INFO, "CryptoPeiEntry: ReInstall Post-Memmory Crypto PPI\n"));
  76. Status = PeiServicesReInstallPpi (
  77. EdkiiCryptoPpiDescriptor,
  78. &mEdkiiCryptoPpiList
  79. );
  80. ASSERT_EFI_ERROR (Status);
  81. } else {
  82. DEBUG ((DEBUG_INFO, "CryptoPeiEntry: Install Post-Memmory Crypto PPI\n"));
  83. Status = PeiServicesInstallPpi (&mEdkiiCryptoPpiList);
  84. }
  85. } else {
  86. ASSERT_EFI_ERROR (Status);
  87. }
  88. return Status;
  89. }