]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalAhciMode.c
SecurityPkg-Opal(2): Enhance AHCI Bar MMIO region check.
[mirror_edk2.git] / SecurityPkg / Tcg / Opal / OpalPasswordSmm / OpalAhciMode.c
index 0dc3490a362d2135e17091031cec7a24bfe1abba..33f77bd8a248248baa75c61b45fca88a7fdc1f38 100644 (file)
@@ -1022,6 +1022,34 @@ GetAhciBarSize (
   return Size;\r
 }\r
 \r
+/**\r
+  This function check if the memory region is in GCD MMIO region.\r
+\r
+  @param Addr  The memory region start address to be checked.\r
+  @param Size  The memory region length to be checked.\r
+\r
+  @retval TRUE  This memory region is in GCD MMIO region.\r
+  @retval FALSE This memory region is not in GCD MMIO region.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+OpalIsValidMmioSpace (\r
+  IN  EFI_PHYSICAL_ADDRESS       Addr,\r
+  IN  UINTN                      Size\r
+  )\r
+{\r
+  UINTN                           Index;\r
+  EFI_GCD_MEMORY_SPACE_DESCRIPTOR *Desc;\r
+\r
+  for (Index = 0; Index < mNumberOfDescriptors; Index ++) {\r
+    Desc = &mGcdMemSpace[Index];\r
+    if ((Desc->GcdMemoryType == EfiGcdMemoryTypeMemoryMappedIo) && (Addr >= Desc->BaseAddress) && ((Addr + Size) <= (Desc->BaseAddress + Desc->Length))) {\r
+      return TRUE;\r
+    }\r
+  }\r
+\r
+  return FALSE;\r
+}\r
 /**\r
   Get AHCI mode base address registers' Value.\r
 \r
@@ -1055,7 +1083,7 @@ GetAhciBaseAddress (
   //\r
   // Check if the AHCI Bar region is in SMRAM to avoid malicious attack by modifying MMIO Bar to point to SMRAM.\r
   //\r
-  if (!SmmIsBufferOutsideSmmValid ((EFI_PHYSICAL_ADDRESS)mAhciBar, Size)) {\r
+  if (!OpalIsValidMmioSpace ((EFI_PHYSICAL_ADDRESS)mAhciBar, Size)) {\r
     return EFI_UNSUPPORTED;\r
   }\r
 \r