]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Pei/Memory/MemoryServices.c
MdeModulePkg/PeiCore: Enable T-RAM evacuation in PeiCore (CVE-2019-11098)
[mirror_edk2.git] / MdeModulePkg / Core / Pei / Memory / MemoryServices.c
index 6b3a64a811cd3cff475fd708420d721a88995b8c..9d933f0393a8eefe6824ae7fb8dc30f091f4902a 100644 (file)
@@ -166,6 +166,88 @@ MigrateMemoryPages (
   Private->FreePhysicalMemoryTop = NewMemPagesBase;\r
 }\r
 \r
+/**\r
+  Removes any FV HOBs whose base address is not in PEI installed memory.\r
+\r
+  @param[in] Private          Pointer to PeiCore's private data structure.\r
+\r
+**/\r
+VOID\r
+RemoveFvHobsInTemporaryMemory (\r
+  IN PEI_CORE_INSTANCE        *Private\r
+  )\r
+{\r
+  EFI_PEI_HOB_POINTERS        Hob;\r
+  EFI_HOB_FIRMWARE_VOLUME     *FirmwareVolumeHob;\r
+\r
+  DEBUG ((DEBUG_INFO, "Removing FVs in FV HOB not already migrated to permanent memory.\n"));\r
+\r
+  for (Hob.Raw = GetHobList (); !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) {\r
+    if (GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_FV || GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_FV2 || GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_FV3) {\r
+      FirmwareVolumeHob = Hob.FirmwareVolume;\r
+      DEBUG ((DEBUG_INFO, "  Found FV HOB.\n"));\r
+      DEBUG ((\r
+          DEBUG_INFO,\r
+          "    BA=%016lx  L=%016lx\n",\r
+          FirmwareVolumeHob->BaseAddress,\r
+          FirmwareVolumeHob->Length\r
+          ));\r
+      if (\r
+        !(\r
+          ((EFI_PHYSICAL_ADDRESS) (UINTN) FirmwareVolumeHob->BaseAddress >= Private->PhysicalMemoryBegin) &&\r
+          (((EFI_PHYSICAL_ADDRESS) (UINTN) FirmwareVolumeHob->BaseAddress + (FirmwareVolumeHob->Length - 1)) < Private->FreePhysicalMemoryTop)\r
+          )\r
+        ) {\r
+        DEBUG ((DEBUG_INFO, "      Removing FV HOB to an FV in T-RAM (was not migrated).\n"));\r
+        Hob.Header->HobType = EFI_HOB_TYPE_UNUSED;\r
+      }\r
+    }\r
+  }\r
+}\r
+\r
+/**\r
+  Migrate the base address in firmware volume allocation HOBs\r
+  from temporary memory to PEI installed memory.\r
+\r
+  @param[in] PrivateData      Pointer to PeiCore's private data structure.\r
+  @param[in] OrgFvHandle      Address of FV Handle in temporary memory.\r
+  @param[in] FvHandle         Address of FV Handle in permanent memory.\r
+\r
+**/\r
+VOID\r
+ConvertFvHob (\r
+  IN PEI_CORE_INSTANCE          *PrivateData,\r
+  IN UINTN                      OrgFvHandle,\r
+  IN UINTN                      FvHandle\r
+  )\r
+{\r
+  EFI_PEI_HOB_POINTERS        Hob;\r
+  EFI_HOB_FIRMWARE_VOLUME     *FirmwareVolumeHob;\r
+  EFI_HOB_FIRMWARE_VOLUME2    *FirmwareVolume2Hob;\r
+  EFI_HOB_FIRMWARE_VOLUME3    *FirmwareVolume3Hob;\r
+\r
+  DEBUG ((DEBUG_INFO, "Converting FVs in FV HOB.\n"));\r
+\r
+  for (Hob.Raw = GetHobList (); !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) {\r
+    if (GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_FV) {\r
+      FirmwareVolumeHob = Hob.FirmwareVolume;\r
+      if (FirmwareVolumeHob->BaseAddress == OrgFvHandle) {\r
+        FirmwareVolumeHob->BaseAddress = FvHandle;\r
+      }\r
+    } else if (GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_FV2) {\r
+      FirmwareVolume2Hob = Hob.FirmwareVolume2;\r
+      if (FirmwareVolume2Hob->BaseAddress == OrgFvHandle) {\r
+        FirmwareVolume2Hob->BaseAddress = FvHandle;\r
+      }\r
+    } else if (GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_FV3) {\r
+      FirmwareVolume3Hob = Hob.FirmwareVolume3;\r
+      if (FirmwareVolume3Hob->BaseAddress == OrgFvHandle) {\r
+        FirmwareVolume3Hob->BaseAddress = FvHandle;\r
+      }\r
+    }\r
+  }\r
+}\r
+\r
 /**\r
   Migrate MemoryBaseAddress in memory allocation HOBs\r
   from the temporary memory to PEI installed memory.\r