SecurityPkg OpalPasswordSmm: Consume SmmIoLib.
authorEric Dong <eric.dong@intel.com>
Wed, 3 May 2017 01:22:26 +0000 (09:22 +0800)
committerEric Dong <eric.dong@intel.com>
Thu, 4 May 2017 00:32:38 +0000 (08:32 +0800)
Update code to consume SmmIoLib to check Mmio validation.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalAhciMode.c
SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalPasswordSmm.c
SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalPasswordSmm.h
SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalPasswordSmm.inf

index 33f77bd8a248248baa75c61b45fca88a7fdc1f38..e38acfd052b50fc197120f4f8464a28e36d4354c 100644 (file)
@@ -1022,34 +1022,6 @@ 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
@@ -1083,7 +1055,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 (!OpalIsValidMmioSpace ((EFI_PHYSICAL_ADDRESS)mAhciBar, Size)) {\r
+  if (!SmmIsMmioValid ((EFI_PHYSICAL_ADDRESS)mAhciBar, Size, NULL)) {\r
     return EFI_UNSUPPORTED;\r
   }\r
 \r
index 2f2a1d9c13e44f4ee289cd2c1679f4a3e44de777..0ea92b15c067720cee0c94bb5a05d186dac36e7d 100644 (file)
@@ -61,9 +61,6 @@ VOID                 *mBuffer = NULL; // DMA can not read/write Data to smram, s
 // NVME\r
 NVME_CONTEXT         mNvmeContext;\r
 \r
-EFI_GCD_MEMORY_SPACE_DESCRIPTOR   *mGcdMemSpace        = NULL;\r
-UINTN                             mNumberOfDescriptors = 0;\r
-\r
 /**\r
   Add new bridge node or nvme device info to the device list.\r
 \r
@@ -647,44 +644,6 @@ S3SleepEntryCallBack (
   return Status;\r
 }\r
 \r
-/**\r
-  OpalPassword Notification for SMM EndOfDxe protocol.\r
-\r
-  @param[in] Protocol   Points to the protocol's unique identifier.\r
-  @param[in] Interface  Points to the interface instance.\r
-  @param[in] Handle     The handle on which the interface was installed.\r
-\r
-  @retval EFI_SUCCESS   Notification runs successfully.\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-OpalPasswordEndOfDxeNotification (\r
-  IN CONST EFI_GUID  *Protocol,\r
-  IN VOID            *Interface,\r
-  IN EFI_HANDLE      Handle\r
-  )\r
-{\r
-  UINTN                            NumberOfDescriptors;\r
-  EFI_GCD_MEMORY_SPACE_DESCRIPTOR  *MemSpaceMap;\r
-  EFI_STATUS                       Status;\r
-\r
-  Status = gDS->GetMemorySpaceMap (&NumberOfDescriptors, &MemSpaceMap);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  mGcdMemSpace = AllocateCopyPool (NumberOfDescriptors * sizeof (EFI_GCD_MEMORY_SPACE_DESCRIPTOR), MemSpaceMap);\r
-  if (EFI_ERROR (Status)) {\r
-    gBS->FreePool (MemSpaceMap);\r
-    return Status;\r
-  }\r
-\r
-  mNumberOfDescriptors = NumberOfDescriptors;\r
-  gBS->FreePool (MemSpaceMap);\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
 /**\r
   Main entry for this driver.\r
 \r
@@ -711,7 +670,6 @@ OpalPasswordSmmInit (
   EFI_SMM_VARIABLE_PROTOCOL             *SmmVariable;\r
   OPAL_EXTRA_INFO_VAR                   OpalExtraInfo;\r
   UINTN                                 DataSize;\r
-  EFI_EVENT                             EndOfDxeEvent;\r
   EFI_PHYSICAL_ADDRESS                  Address;\r
 \r
   mBuffer            = NULL;\r
@@ -820,15 +778,6 @@ OpalPasswordSmmInit (
   //\r
   mSwSmiValue = (UINT8) Context.SwSmiInputValue;\r
 \r
-  //\r
-  // Create event to record GCD descriptors at end of dxe for judging AHCI/NVMe PCI Bar\r
-  // is in MMIO space to avoid attack.\r
-  //\r
-  Status = gSmst->SmmRegisterProtocolNotify (&gEfiSmmEndOfDxeProtocolGuid, OpalPasswordEndOfDxeNotification, &EndOfDxeEvent);\r
-  if (EFI_ERROR (Status)) {\r
-    DEBUG((DEBUG_ERROR, "OpalPasswordSmm: Register SmmEndOfDxe fail, Status: %r\n", Status));\r
-    goto EXIT;\r
-  }\r
   Status = gSmst->SmmLocateProtocol (&gEfiSmmVariableProtocolGuid, NULL, (VOID**)&SmmVariable);\r
   if (!EFI_ERROR (Status)) {\r
     DataSize = sizeof (OPAL_EXTRA_INFO_VAR);\r
index ab31a6bfe7bc59b8b2dc0a34468047f8861961da..ce88786fabc63409c8b97d43daf26def16bbe3b6 100644 (file)
@@ -45,6 +45,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Library/S3BootScriptLib.h>\r
 #include <Library/DevicePathLib.h>\r
 #include <Library/DxeServicesTableLib.h>\r
+#include <Library/SmmIoLib.h>\r
 \r
 #include <IndustryStandard/Pci22.h>\r
 \r
@@ -70,8 +71,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 extern VOID                              *mBuffer;\r
 \r
-extern EFI_GCD_MEMORY_SPACE_DESCRIPTOR   *mGcdMemSpace;\r
-extern UINTN                             mNumberOfDescriptors;\r
 #pragma pack(1)\r
 \r
 typedef struct {\r
index cab0fd5656d93c0d3523018d7e095be1eb3ccbcb..c62fa13271d88b09696528ccad8b5a2f4b2954db 100644 (file)
@@ -58,6 +58,7 @@
   DxeServicesTableLib\r
   DevicePathLib\r
   OpalPasswordSupportLib\r
+  SmmIoLib\r
 \r
 [Guids]\r
   gOpalExtraInfoVariableGuid                    ## CONSUMES ## GUID\r
@@ -69,7 +70,6 @@
   gEfiSmmSxDispatch2ProtocolGuid                ## CONSUMES\r
   gEfiSmmVariableProtocolGuid                   ## CONSUMES\r
   gEfiStorageSecurityCommandProtocolGuid        ## CONSUMES\r
-  gEfiSmmEndOfDxeProtocolGuid                   ## CONSUMES\r
 \r
 [Depex]\r
   gEfiSmmSwDispatch2ProtocolGuid AND\r