]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/PiSmmCore/SmiHandlerProfile.c
MdeModulePkg SmiHandlerProfile: Use fixed data type in data structure
[mirror_edk2.git] / MdeModulePkg / Core / PiSmmCore / SmiHandlerProfile.c
index 1e36039dd44350e4cfd9b0c4c0bf5970c058b736..f41353a6b82f4a53932c3af24d28ca7eda308740 100644 (file)
@@ -33,14 +33,17 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #include "PiSmmCore.h"\r
 \r
+#define GET_OCCUPIED_SIZE(ActualSize, Alignment) \\r
+  ((ActualSize) + (((Alignment) - ((ActualSize) & ((Alignment) - 1))) & ((Alignment) - 1)))\r
+\r
 typedef struct {\r
-  EFI_GUID FileGuid;\r
-  UINTN    ImageRef;\r
-  UINTN    EntryPoint;\r
-  UINTN    ImageBase;\r
-  UINTN    ImageSize;\r
-  UINTN    PdbStringSize;\r
-  CHAR8    *PdbString;\r
+  EFI_GUID            FileGuid;\r
+  PHYSICAL_ADDRESS    EntryPoint;\r
+  PHYSICAL_ADDRESS    ImageBase;\r
+  UINT64              ImageSize;\r
+  UINT32              ImageRef;\r
+  UINT16              PdbStringSize;\r
+  CHAR8               *PdbString;\r
 } IMAGE_STRUCT;\r
 \r
 /**\r
@@ -89,8 +92,8 @@ GLOBAL_REMOVE_IF_UNREFERENCED LIST_ENTRY      *mSmmCoreSmiEntryList = &mSmiEntry
 GLOBAL_REMOVE_IF_UNREFERENCED LIST_ENTRY      *mSmmCoreHardwareSmiEntryList = &mHardwareSmiEntryList;\r
 \r
 GLOBAL_REMOVE_IF_UNREFERENCED IMAGE_STRUCT  *mImageStruct;\r
-GLOBAL_REMOVE_IF_UNREFERENCED UINT        mImageStructCountMax;\r
-GLOBAL_REMOVE_IF_UNREFERENCED UINT        mImageStructCount;\r
+GLOBAL_REMOVE_IF_UNREFERENCED UINT32        mImageStructCountMax;\r
+GLOBAL_REMOVE_IF_UNREFERENCED UINT32        mImageStructCount;\r
 \r
 GLOBAL_REMOVE_IF_UNREFERENCED VOID   *mSmiHandlerProfileDatabase;\r
 GLOBAL_REMOVE_IF_UNREFERENCED UINTN  mSmiHandlerProfileDatabaseSize;\r
@@ -162,11 +165,11 @@ GetDriverGuid (
 **/\r
 VOID\r
 AddImageStruct(\r
-  IN UINTN     ImageBase,\r
-  IN UINTN     ImageSize,\r
-  IN UINTN     EntryPoint,\r
-  IN EFI_GUID  *Guid,\r
-  IN CHAR8     *PdbString\r
+  IN PHYSICAL_ADDRESS       ImageBase,\r
+  IN UINT64                 ImageSize,\r
+  IN PHYSICAL_ADDRESS       EntryPoint,\r
+  IN EFI_GUID               *Guid,\r
+  IN CHAR8                  *PdbString\r
   )\r
 {\r
   UINTN  PdbStringSize;\r
@@ -185,7 +188,7 @@ AddImageStruct(
     PdbStringSize = AsciiStrSize(PdbString);\r
     mImageStruct[mImageStructCount].PdbString = AllocateCopyPool (PdbStringSize, PdbString);\r
     if (mImageStruct[mImageStructCount].PdbString != NULL) {\r
-      mImageStruct[mImageStructCount].PdbStringSize = PdbStringSize;\r
+      mImageStruct[mImageStructCount].PdbStringSize = (UINT16) PdbStringSize;\r
     }\r
   }\r
 \r
@@ -222,7 +225,7 @@ AddressToImageStruct(
 \r
   @return image reference index\r
 **/\r
-UINTN\r
+UINT32\r
 AddressToImageRef(\r
   IN UINTN  Address\r
   )\r
@@ -233,7 +236,7 @@ AddressToImageRef(
   if (ImageStruct != NULL) {\r
     return ImageStruct->ImageRef;\r
   }\r
-  return (UINTN)-1;\r
+  return (UINT32)-1;\r
 }\r
 \r
 /**\r
@@ -252,11 +255,11 @@ GetSmmLoadedImage(
   EFI_LOADED_IMAGE_PROTOCOL  *LoadedImage;\r
   CHAR16                     *PathStr;\r
   EFI_SMM_DRIVER_ENTRY       *LoadedImagePrivate;\r
-  UINTN                      EntryPoint;\r
+  PHYSICAL_ADDRESS           EntryPoint;\r
   VOID                       *EntryPointInImage;\r
   EFI_GUID                   Guid;\r
   CHAR8                      *PdbString;\r
-  UINTN                      RealImageBase;\r
+  PHYSICAL_ADDRESS           RealImageBase;\r
 \r
   HandleBufferSize = 0;\r
   HandleBuffer = NULL;\r
@@ -286,7 +289,7 @@ GetSmmLoadedImage(
   }\r
 \r
   NoHandles = HandleBufferSize/sizeof(EFI_HANDLE);\r
-  mImageStructCountMax = NoHandles;\r
+  mImageStructCountMax = (UINT32) NoHandles;\r
   mImageStruct = AllocateZeroPool(mImageStructCountMax * sizeof(IMAGE_STRUCT));\r
   if (mImageStruct == NULL) {\r
     goto Done;\r
@@ -309,8 +312,8 @@ GetSmmLoadedImage(
     LoadedImagePrivate = BASE_CR(LoadedImage, EFI_SMM_DRIVER_ENTRY, SmmLoadedImage);\r
     RealImageBase = (UINTN)LoadedImage->ImageBase;\r
     if (LoadedImagePrivate->Signature == EFI_SMM_DRIVER_ENTRY_SIGNATURE) {\r
-      EntryPoint = (UINTN)LoadedImagePrivate->ImageEntryPoint;\r
-      if ((EntryPoint != 0) && ((EntryPoint < (UINTN)LoadedImage->ImageBase) || (EntryPoint >= ((UINTN)LoadedImage->ImageBase + (UINTN)LoadedImage->ImageSize)))) {\r
+      EntryPoint = LoadedImagePrivate->ImageEntryPoint;\r
+      if ((EntryPoint != 0) && ((EntryPoint < (UINTN)LoadedImage->ImageBase) || (EntryPoint >= ((UINTN)LoadedImage->ImageBase + LoadedImage->ImageSize)))) {\r
         //\r
         // If the EntryPoint is not in the range of image buffer, it should come from emulation environment.\r
         // So patch ImageBuffer here to align the EntryPoint.\r
@@ -320,9 +323,9 @@ GetSmmLoadedImage(
         RealImageBase = (UINTN)LoadedImage->ImageBase + EntryPoint - (UINTN)EntryPointInImage;\r
       }\r
     }\r
-    DEBUG ((DEBUG_INFO, "(0x%x - 0x%x", RealImageBase, (UINTN)LoadedImage->ImageSize));\r
+    DEBUG ((DEBUG_INFO, "(0x%lx - 0x%lx", RealImageBase, LoadedImage->ImageSize));\r
     if (EntryPoint != 0) {\r
-      DEBUG ((DEBUG_INFO, ", EntryPoint:0x%x", EntryPoint));\r
+      DEBUG ((DEBUG_INFO, ", EntryPoint:0x%lx", EntryPoint));\r
     }\r
     DEBUG ((DEBUG_INFO, ")\n"));\r
 \r
@@ -334,7 +337,7 @@ GetSmmLoadedImage(
     }\r
     DEBUG ((DEBUG_INFO, "       (%s)\n", PathStr));\r
 \r
-    AddImageStruct((UINTN)RealImageBase, (UINTN)LoadedImage->ImageSize, EntryPoint, &Guid, PdbString);\r
+    AddImageStruct(RealImageBase, LoadedImage->ImageSize, EntryPoint, &Guid, PdbString);\r
   }\r
 \r
 Done:\r
@@ -356,8 +359,10 @@ DumpSmiChildContext (
   IN UINTN      ContextSize\r
   )\r
 {\r
+  CHAR16        *Str;\r
+\r
   if (CompareGuid (HandlerType, &gEfiSmmSwDispatch2ProtocolGuid)) {\r
-    DEBUG ((DEBUG_INFO, "  SwSmi - 0x%x\n", ((EFI_SMM_SW_REGISTER_CONTEXT *)Context)->SwSmiInputValue));\r
+    DEBUG ((DEBUG_INFO, "  SwSmi - 0x%lx\n", ((SMI_HANDLER_PROFILE_SW_REGISTER_CONTEXT *)Context)->SwSmiInputValue));\r
   } else if (CompareGuid (HandlerType, &gEfiSmmSxDispatch2ProtocolGuid)) {\r
     DEBUG ((DEBUG_INFO, "  SxType - 0x%x\n", ((EFI_SMM_SX_REGISTER_CONTEXT *)Context)->Type));\r
     DEBUG ((DEBUG_INFO, "  SxPhase - 0x%x\n", ((EFI_SMM_SX_REGISTER_CONTEXT *)Context)->Phase));\r
@@ -376,7 +381,11 @@ DumpSmiChildContext (
     DEBUG ((DEBUG_INFO, "  IoTrapType - 0x%x\n", ((EFI_SMM_IO_TRAP_REGISTER_CONTEXT *)Context)->Type));\r
   } else if (CompareGuid (HandlerType, &gEfiSmmUsbDispatch2ProtocolGuid)) {\r
     DEBUG ((DEBUG_INFO, "  UsbType - 0x%x\n", ((SMI_HANDLER_PROFILE_USB_REGISTER_CONTEXT *)Context)->Type));\r
-    DEBUG ((DEBUG_INFO, "  UsbDevicePath - %s\n", ConvertDevicePathToText((EFI_DEVICE_PATH_PROTOCOL *)(((SMI_HANDLER_PROFILE_USB_REGISTER_CONTEXT *)Context) + 1), TRUE, TRUE)));\r
+    Str = ConvertDevicePathToText((EFI_DEVICE_PATH_PROTOCOL *)(((SMI_HANDLER_PROFILE_USB_REGISTER_CONTEXT *)Context) + 1), TRUE, TRUE);\r
+    DEBUG ((DEBUG_INFO, "  UsbDevicePath - %s\n", Str));\r
+    if (Str != NULL) {\r
+      FreePool (Str);\r
+    }\r
   } else {\r
     DEBUG ((DEBUG_INFO, "  Context - "));\r
     InternalDumpData (Context, ContextSize);\r
@@ -416,12 +425,12 @@ DumpSmiHandlerOnSmiEntry(
     }\r
     DEBUG ((DEBUG_INFO, "  Handler - 0x%x", SmiHandler->Handler));\r
     if (ImageStruct != NULL) {\r
-      DEBUG ((DEBUG_INFO, " <== RVA - 0x%x", (UINTN)SmiHandler->Handler - ImageStruct->ImageBase));\r
+      DEBUG ((DEBUG_INFO, " <== RVA - 0x%x", (UINTN)SmiHandler->Handler - (UINTN) ImageStruct->ImageBase));\r
     }\r
     DEBUG ((DEBUG_INFO, "\n"));\r
     DEBUG ((DEBUG_INFO, "  CallerAddr - 0x%x", SmiHandler->CallerAddr));\r
     if (ImageStruct != NULL) {\r
-      DEBUG ((DEBUG_INFO, " <== RVA - 0x%x", SmiHandler->CallerAddr - ImageStruct->ImageBase));\r
+      DEBUG ((DEBUG_INFO, " <== RVA - 0x%x", SmiHandler->CallerAddr - (UINTN) ImageStruct->ImageBase));\r
     }\r
     DEBUG ((DEBUG_INFO, "\n"));\r
   }\r
@@ -527,11 +536,11 @@ GetSmmImageDatabaseSize(
   )\r
 {\r
   UINTN  Size;\r
-  UINT Index;\r
+  UINT32 Index;\r
 \r
-  Size = (sizeof(SMM_CORE_IMAGE_DATABASE_STRUCTURE)) * mImageStructCount;\r
+  Size = 0;\r
   for (Index = 0; Index < mImageStructCount; Index++) {\r
-    Size += mImageStruct[Index].PdbStringSize;\r
+    Size += sizeof(SMM_CORE_IMAGE_DATABASE_STRUCTURE) + GET_OCCUPIED_SIZE (mImageStruct[Index].PdbStringSize, sizeof (UINT64));\r
   }\r
   return Size;\r
 }\r
@@ -558,7 +567,7 @@ GetSmmSmiHandlerSizeOnSmiEntry(
        ListEntry != &SmiEntry->SmiHandlers;\r
        ListEntry = ListEntry->ForwardLink) {\r
     SmiHandler = CR(ListEntry, SMI_HANDLER, Link, SMI_HANDLER_SIGNATURE);\r
-    Size += sizeof(SMM_CORE_SMI_HANDLER_STRUCTURE) + SmiHandler->ContextSize;\r
+    Size += sizeof(SMM_CORE_SMI_HANDLER_STRUCTURE) + GET_OCCUPIED_SIZE (SmiHandler->ContextSize, sizeof (UINT64));\r
   }\r
 \r
   return Size;\r
@@ -634,21 +643,25 @@ GetSmmImageDatabaseData (
     if (Size >= ExpectedSize) {\r
       return 0;\r
     }\r
-    if (sizeof(SMM_CORE_IMAGE_DATABASE_STRUCTURE) + mImageStruct[Index].PdbStringSize > ExpectedSize - Size) {\r
+    if (sizeof(SMM_CORE_IMAGE_DATABASE_STRUCTURE) + GET_OCCUPIED_SIZE (mImageStruct[Index].PdbStringSize, sizeof (UINT64)) > ExpectedSize - Size) {\r
       return 0;\r
     }\r
     ImageStruct->Header.Signature = SMM_CORE_IMAGE_DATABASE_SIGNATURE;\r
-    ImageStruct->Header.Length = (UINT32)(sizeof(SMM_CORE_IMAGE_DATABASE_STRUCTURE) + mImageStruct[Index].PdbStringSize);\r
+    ImageStruct->Header.Length = (UINT32)(sizeof(SMM_CORE_IMAGE_DATABASE_STRUCTURE) + GET_OCCUPIED_SIZE (mImageStruct[Index].PdbStringSize, sizeof (UINT64)));\r
     ImageStruct->Header.Revision = SMM_CORE_IMAGE_DATABASE_REVISION;\r
     CopyGuid(&ImageStruct->FileGuid, &mImageStruct[Index].FileGuid);\r
     ImageStruct->ImageRef = mImageStruct[Index].ImageRef;\r
     ImageStruct->EntryPoint = mImageStruct[Index].EntryPoint;\r
     ImageStruct->ImageBase = mImageStruct[Index].ImageBase;\r
     ImageStruct->ImageSize = mImageStruct[Index].ImageSize;\r
-    ImageStruct->PdbStringOffset = sizeof(SMM_CORE_IMAGE_DATABASE_STRUCTURE);\r
-    CopyMem ((VOID *)((UINTN)ImageStruct + ImageStruct->PdbStringOffset), mImageStruct[Index].PdbString, mImageStruct[Index].PdbStringSize);\r
+    if (mImageStruct[Index].PdbStringSize != 0) {\r
+      ImageStruct->PdbStringOffset = sizeof(SMM_CORE_IMAGE_DATABASE_STRUCTURE);\r
+      CopyMem ((VOID *)((UINTN)ImageStruct + ImageStruct->PdbStringOffset), mImageStruct[Index].PdbString, mImageStruct[Index].PdbStringSize);\r
+    } else {\r
+      ImageStruct->PdbStringOffset = 0;\r
+    }\r
     ImageStruct = (SMM_CORE_IMAGE_DATABASE_STRUCTURE *)((UINTN)ImageStruct + ImageStruct->Header.Length);\r
-    Size += sizeof(SMM_CORE_IMAGE_DATABASE_STRUCTURE) + mImageStruct[Index].PdbStringSize;\r
+    Size += sizeof(SMM_CORE_IMAGE_DATABASE_STRUCTURE) + GET_OCCUPIED_SIZE (mImageStruct[Index].PdbStringSize, sizeof (UINT64));\r
   }\r
 \r
   if (ExpectedSize != Size) {\r
@@ -672,7 +685,7 @@ GetSmmSmiHandlerDataOnSmiEntry(
   IN     SMI_ENTRY       *SmiEntry,\r
   IN OUT VOID            *Data,\r
   IN     UINTN           MaxSize,\r
-     OUT UINT          *Count\r
+     OUT UINT32          *Count\r
   )\r
 {\r
   SMM_CORE_SMI_HANDLER_STRUCTURE   *SmiHandlerStruct;\r
@@ -692,11 +705,11 @@ GetSmmSmiHandlerDataOnSmiEntry(
       *Count = 0;\r
       return 0;\r
     }\r
-    if (sizeof(SMM_CORE_SMI_HANDLER_STRUCTURE) + SmiHandler->ContextSize > MaxSize - Size) {\r
+    if (sizeof(SMM_CORE_SMI_HANDLER_STRUCTURE) + GET_OCCUPIED_SIZE (SmiHandler->ContextSize, sizeof (UINT64)) > MaxSize - Size) {\r
       *Count = 0;\r
       return 0;\r
     }\r
-    SmiHandlerStruct->Length = (UINT32)(sizeof(SMM_CORE_SMI_HANDLER_STRUCTURE) + SmiHandler->ContextSize);\r
+    SmiHandlerStruct->Length = (UINT32)(sizeof(SMM_CORE_SMI_HANDLER_STRUCTURE) + GET_OCCUPIED_SIZE (SmiHandler->ContextSize, sizeof (UINT64)));\r
     SmiHandlerStruct->CallerAddr = (UINTN)SmiHandler->CallerAddr;\r
     SmiHandlerStruct->Handler = (UINTN)SmiHandler->Handler;\r
     SmiHandlerStruct->ImageRef = AddressToImageRef((UINTN)SmiHandler->Handler);\r
@@ -707,7 +720,7 @@ GetSmmSmiHandlerDataOnSmiEntry(
     } else {\r
       SmiHandlerStruct->ContextBufferOffset = 0;\r
     }\r
-    Size += sizeof(SMM_CORE_SMI_HANDLER_STRUCTURE) + SmiHandler->ContextSize;\r
+    Size += sizeof(SMM_CORE_SMI_HANDLER_STRUCTURE) + GET_OCCUPIED_SIZE (SmiHandler->ContextSize, sizeof (UINT64));\r
     SmiHandlerStruct = (SMM_CORE_SMI_HANDLER_STRUCTURE *)((UINTN)SmiHandlerStruct + SmiHandlerStruct->Length);\r
     *Count = *Count + 1;\r
   }\r
@@ -738,7 +751,7 @@ GetSmmSmiDatabaseData(
   SMI_ENTRY                         *SmiEntry;\r
   UINTN                             Size;\r
   UINTN                             SmiHandlerSize;\r
-  UINT                            SmiHandlerCount;\r
+  UINT32                            SmiHandlerCount;\r
 \r
   SmiStruct = Data;\r
   Size = 0;\r
@@ -1122,6 +1135,36 @@ ConvertSmiHandlerUsbContext (
   return SmiHandlerUsbContext;\r
 }\r
 \r
+/**\r
+  Convert EFI_SMM_SW_REGISTER_CONTEXT to SMI_HANDLER_PROFILE_SW_REGISTER_CONTEXT.\r
+\r
+  @param SwContext                    A pointer to EFI_SMM_SW_REGISTER_CONTEXT\r
+  @param SwContextSize                The size of EFI_SMM_SW_REGISTER_CONTEXT in bytes\r
+  @param SmiHandlerSwContextSize      The size of SMI_HANDLER_PROFILE_SW_REGISTER_CONTEXT in bytes\r
+\r
+  @return SmiHandlerSwContext   A pointer to SMI_HANDLER_PROFILE_SW_REGISTER_CONTEXT\r
+**/\r
+SMI_HANDLER_PROFILE_SW_REGISTER_CONTEXT *\r
+ConvertSmiHandlerSwContext (\r
+  IN EFI_SMM_SW_REGISTER_CONTEXT    *SwContext,\r
+  IN UINTN                          SwContextSize,\r
+  OUT UINTN                         *SmiHandlerSwContextSize\r
+  )\r
+{\r
+  SMI_HANDLER_PROFILE_SW_REGISTER_CONTEXT  *SmiHandlerSwContext;\r
+\r
+  ASSERT (SwContextSize == sizeof(EFI_SMM_SW_REGISTER_CONTEXT));\r
+\r
+  SmiHandlerSwContext = AllocatePool (sizeof (SMI_HANDLER_PROFILE_SW_REGISTER_CONTEXT));\r
+  if (SmiHandlerSwContext == NULL) {\r
+    *SmiHandlerSwContextSize = 0;\r
+    return NULL;\r
+  }\r
+  SmiHandlerSwContext->SwSmiInputValue = SwContext->SwSmiInputValue;\r
+  *SmiHandlerSwContextSize = sizeof (SMI_HANDLER_PROFILE_SW_REGISTER_CONTEXT);\r
+  return SmiHandlerSwContext;\r
+}\r
+\r
 /**\r
   This function is called by SmmChildDispatcher module to report\r
   a new SMI handler is registered, to SmmCore.\r
@@ -1176,6 +1219,8 @@ SmiHandlerProfileRegisterHandler (
   if (Context != NULL) {\r
     if (CompareGuid (HandlerGuid, &gEfiSmmUsbDispatch2ProtocolGuid)) {\r
       SmiHandler->Context = ConvertSmiHandlerUsbContext (Context, ContextSize, &SmiHandler->ContextSize);\r
+    } else if (CompareGuid (HandlerGuid, &gEfiSmmSwDispatch2ProtocolGuid)) {\r
+      SmiHandler->Context = ConvertSmiHandlerSwContext (Context, ContextSize, &SmiHandler->ContextSize);\r
     } else {\r
       SmiHandler->Context = AllocateCopyPool (ContextSize, Context);\r
     }\r
@@ -1186,7 +1231,9 @@ SmiHandlerProfileRegisterHandler (
 \r
   SmiEntry = SmmCoreFindHardwareSmiEntry (HandlerGuid, TRUE);\r
   if (SmiEntry == NULL) {\r
-    FreePool (SmiHandler->Context);\r
+    if (SmiHandler->Context != NULL) {\r
+      FreePool (SmiHandler->Context);\r
+    }\r
     FreePool (SmiHandler);\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
@@ -1249,6 +1296,8 @@ SmiHandlerProfileUnregisterHandler (
   if (Context != NULL) {\r
     if (CompareGuid (HandlerGuid, &gEfiSmmUsbDispatch2ProtocolGuid)) {\r
       SearchContext = ConvertSmiHandlerUsbContext (Context, ContextSize, &SearchContextSize);\r
+    } else if (CompareGuid (HandlerGuid, &gEfiSmmSwDispatch2ProtocolGuid)) {\r
+      SearchContext = ConvertSmiHandlerSwContext (Context, ContextSize, &SearchContextSize);\r
     }\r
   }\r
 \r
@@ -1277,6 +1326,9 @@ SmiHandlerProfileUnregisterHandler (
   SmiHandler = TargetSmiHandler;\r
 \r
   RemoveEntryList (&SmiHandler->Link);\r
+  if (SmiHandler->Context != NULL) {\r
+    FreePool (SmiHandler->Context);\r
+  }\r
   FreePool (SmiHandler);\r
 \r
   if (IsListEmpty (&SmiEntry->SmiHandlers)) {\r