PlatformSecPpiLib.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. /**@file
  2. Library to install platform PPI before PEI Core
  3. Copyright (c) 2021, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>
  4. SPDX-License-Identifier: BSD-2-Clause-Patent
  5. **/
  6. //
  7. // The package level header files this module uses
  8. //
  9. #include <PiPei.h>
  10. #include <IndustryStandard/RiscVOpensbi.h>
  11. #include <Library/BaseMemoryLib.h>
  12. #include <Library/DebugLib.h>
  13. #include <Library/DebugPrintErrorLevelLib.h>
  14. #include <Library/PlatformSecPpiLib.h>
  15. #include <Library/PrintLib.h>
  16. #include <Library/RiscVFirmwareContextLib.h>
  17. #include <Ppi/TemporaryRamDone.h>
  18. #include <Ppi/TemporaryRamSupport.h>
  19. EFI_STATUS
  20. EFIAPI
  21. TemporaryRamMigration (
  22. IN CONST EFI_PEI_SERVICES **PeiServices,
  23. IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase,
  24. IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase,
  25. IN UINTN CopySize
  26. );
  27. EFI_STATUS
  28. EFIAPI
  29. TemporaryRamDone (
  30. VOID
  31. );
  32. STATIC EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI mTemporaryRamSupportPpi = {
  33. TemporaryRamMigration
  34. };
  35. STATIC EFI_PEI_TEMPORARY_RAM_DONE_PPI mTemporaryRamDonePpi = {
  36. TemporaryRamDone
  37. };
  38. STATIC EFI_PEI_PPI_DESCRIPTOR mPrivateDispatchTable[] = {
  39. {
  40. EFI_PEI_PPI_DESCRIPTOR_PPI,
  41. &gEfiTemporaryRamSupportPpiGuid,
  42. &mTemporaryRamSupportPpi
  43. },
  44. {
  45. (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
  46. &gEfiTemporaryRamDonePpiGuid,
  47. &mTemporaryRamDonePpi
  48. },
  49. };
  50. /** Temporary RAM migration function.
  51. This function migrates the data from temporary RAM to permanent
  52. memory.
  53. @param[in] PeiServices PEI service
  54. @param[in] TemporaryMemoryBase Temporary memory base address
  55. @param[in] PermanentMemoryBase Permanent memory base address
  56. @param[in] CopySize Size to copy
  57. **/
  58. EFI_STATUS
  59. EFIAPI
  60. TemporaryRamMigration (
  61. IN CONST EFI_PEI_SERVICES **PeiServices,
  62. IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase,
  63. IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase,
  64. IN UINTN CopySize
  65. )
  66. {
  67. VOID *OldHeap;
  68. VOID *NewHeap;
  69. VOID *OldStack;
  70. VOID *NewStack;
  71. EFI_RISCV_OPENSBI_FIRMWARE_CONTEXT *FirmwareContext;
  72. DEBUG ((DEBUG_INFO,
  73. "%a: Temp Mem Base:0x%Lx, Permanent Mem Base:0x%Lx, CopySize:0x%Lx\n",
  74. __FUNCTION__,
  75. TemporaryMemoryBase,
  76. PermanentMemoryBase,
  77. (UINT64)CopySize
  78. ));
  79. OldHeap = (VOID*)(UINTN)TemporaryMemoryBase;
  80. NewHeap = (VOID*)((UINTN)PermanentMemoryBase + (CopySize >> 1));
  81. OldStack = (VOID*)((UINTN)TemporaryMemoryBase + (CopySize >> 1));
  82. NewStack = (VOID*)(UINTN)PermanentMemoryBase;
  83. CopyMem (NewHeap, OldHeap, CopySize >> 1); // Migrate Heap
  84. CopyMem (NewStack, OldStack, CopySize >> 1); // Migrate Stack
  85. //
  86. // Reset firmware context pointer
  87. //
  88. GetFirmwareContextPointer (&FirmwareContext);
  89. FirmwareContext = (VOID *)FirmwareContext + (unsigned long)((UINTN)NewStack - (UINTN)OldStack);
  90. SetFirmwareContextPointer (FirmwareContext);
  91. //
  92. // Relocate PEI Service **
  93. //
  94. FirmwareContext->PeiServiceTable += (unsigned long)((UINTN)NewStack - (UINTN)OldStack);
  95. DEBUG ((DEBUG_INFO, "%a: OpenSBI Firmware Context is relocated to 0x%x\n", __FUNCTION__, FirmwareContext));
  96. DEBUG ((DEBUG_INFO, "OpenSBI Firmware Context at 0x%x\n", FirmwareContext));
  97. DEBUG ((DEBUG_INFO, " PEI Service at 0x%x\n\n", FirmwareContext->PeiServiceTable));
  98. register uintptr_t a0 asm ("a0") = (uintptr_t)((UINTN)NewStack - (UINTN)OldStack);
  99. asm volatile ("add sp, sp, a0"::"r"(a0):);
  100. return EFI_SUCCESS;
  101. }
  102. /** Temprary RAM done function.
  103. **/
  104. EFI_STATUS EFIAPI TemporaryRamDone (
  105. VOID
  106. )
  107. {
  108. DEBUG ((DEBUG_INFO, "%a: 2nd time PEI core, temporary ram done.\n", __FUNCTION__));
  109. return EFI_SUCCESS;
  110. }
  111. /** Return platform SEC PPI before PEI Core
  112. @param[in,out] ThisPpiList Pointer to retrieve EFI_PEI_PPI_DESCRIPTOR.
  113. **/
  114. EFI_STATUS
  115. GetPlatformPrePeiCorePpiDescriptor (
  116. IN OUT EFI_PEI_PPI_DESCRIPTOR **ThisPpiList
  117. )
  118. {
  119. *ThisPpiList = mPrivateDispatchTable;
  120. return EFI_SUCCESS;
  121. }