]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg SmiHandlerProfile: Use fixed data type in data structure
authorStar Zeng <star.zeng@intel.com>
Tue, 23 May 2017 02:51:13 +0000 (10:51 +0800)
committerStar Zeng <star.zeng@intel.com>
Wed, 24 May 2017 07:27:34 +0000 (15:27 +0800)
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=568

Use fixed data type in data structure and make the structure
be natural aligned.
Without this update, the code must assume DXE and SMM are using
same data type (same size of UINTN), but it may be not true at
some case, for example, after standalone SMM feature is enabled.
With this update, the data structure will be phase independent
and convenient for consumer to parse the data.

Cc: Jiewen Yao <jiewen.yao@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Star Zeng <star.zeng@intel.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
MdeModulePkg/Application/SmiHandlerProfileInfo/SmiHandlerProfileInfo.c
MdeModulePkg/Core/PiSmmCore/SmiHandlerProfile.c
MdeModulePkg/Include/Guid/SmiHandlerProfile.h

index 338671374c727a1d4970b5a1f1571fa4a41f5901..96e9977aad0ce8322c02f59d3566c07227f3f49b 100644 (file)
@@ -348,9 +348,9 @@ DumpSmmLoadedImage(
     if (ImageStruct->Header.Signature == SMM_CORE_IMAGE_DATABASE_SIGNATURE) {\r
       NameString = GetDriverNameString (ImageStruct);\r
       Print(L"  <Image Name=\"%a\"", NameString);\r
     if (ImageStruct->Header.Signature == SMM_CORE_IMAGE_DATABASE_SIGNATURE) {\r
       NameString = GetDriverNameString (ImageStruct);\r
       Print(L"  <Image Name=\"%a\"", NameString);\r
-      Print(L" Base=\"0x%x\" Size=\"0x%x\"", ImageStruct->ImageBase, ImageStruct->ImageSize);\r
+      Print(L" Base=\"0x%lx\" Size=\"0x%lx\"", ImageStruct->ImageBase, ImageStruct->ImageSize);\r
       if (ImageStruct->EntryPoint != 0) {\r
       if (ImageStruct->EntryPoint != 0) {\r
-        Print(L" EntryPoint=\"0x%x\"", ImageStruct->EntryPoint);\r
+        Print(L" EntryPoint=\"0x%lx\"", ImageStruct->EntryPoint);\r
       }\r
       Print(L" FvFile=\"%g\"", &ImageStruct->FileGuid);\r
       Print(L" RefId=\"0x%x\"", ImageStruct->ImageRef);\r
       }\r
       Print(L" FvFile=\"%g\"", &ImageStruct->FileGuid);\r
       Print(L" RefId=\"0x%x\"", ImageStruct->ImageRef);\r
@@ -540,7 +540,7 @@ DumpSmiChildContext (
   CHAR16        *Str;\r
 \r
   if (CompareGuid (HandlerType, &gEfiSmmSwDispatch2ProtocolGuid)) {\r
   CHAR16        *Str;\r
 \r
   if (CompareGuid (HandlerType, &gEfiSmmSwDispatch2ProtocolGuid)) {\r
-    Print(L" SwSmi=\"0x%x\"", ((EFI_SMM_SW_REGISTER_CONTEXT *)Context)->SwSmiInputValue);\r
+    Print(L" SwSmi=\"0x%lx\"", ((SMI_HANDLER_PROFILE_SW_REGISTER_CONTEXT *)Context)->SwSmiInputValue);\r
   } else if (CompareGuid (HandlerType, &gEfiSmmSxDispatch2ProtocolGuid)) {\r
     Print(L" SxType=\"%a\"", SxTypeToString(((EFI_SMM_SX_REGISTER_CONTEXT *)Context)->Type));\r
     Print(L" SxPhase=\"%a\"", SxPhaseToString(((EFI_SMM_SX_REGISTER_CONTEXT *)Context)->Phase));\r
   } else if (CompareGuid (HandlerType, &gEfiSmmSxDispatch2ProtocolGuid)) {\r
     Print(L" SxType=\"%a\"", SxTypeToString(((EFI_SMM_SX_REGISTER_CONTEXT *)Context)->Type));\r
     Print(L" SxPhase=\"%a\"", SxPhaseToString(((EFI_SMM_SX_REGISTER_CONTEXT *)Context)->Phase));\r
@@ -609,14 +609,14 @@ DumpSmiHandler(
           Print(L"      <Pdb>%a</Pdb>\n", (UINT8 *)ImageStruct + ImageStruct->PdbStringOffset);\r
         }\r
         Print(L"      </Module>\n");\r
           Print(L"      <Pdb>%a</Pdb>\n", (UINT8 *)ImageStruct + ImageStruct->PdbStringOffset);\r
         }\r
         Print(L"      </Module>\n");\r
-        Print(L"      <Handler Address=\"0x%x\">\n", SmiHandlerStruct->Handler);\r
+        Print(L"      <Handler Address=\"0x%lx\">\n", SmiHandlerStruct->Handler);\r
         if (ImageStruct != NULL) {\r
         if (ImageStruct != NULL) {\r
-          Print(L"         <RVA>0x%x</RVA>\n", SmiHandlerStruct->Handler - ImageStruct->ImageBase);\r
+          Print(L"         <RVA>0x%x</RVA>\n", (UINTN) (SmiHandlerStruct->Handler - ImageStruct->ImageBase));\r
         }\r
         Print(L"      </Handler>\n", SmiHandlerStruct->Handler);\r
         }\r
         Print(L"      </Handler>\n", SmiHandlerStruct->Handler);\r
-        Print(L"      <Caller Address=\"0x%x\">\n", SmiHandlerStruct->CallerAddr);\r
+        Print(L"      <Caller Address=\"0x%lx\">\n", SmiHandlerStruct->CallerAddr);\r
         if (ImageStruct != NULL) {\r
         if (ImageStruct != NULL) {\r
-          Print(L"         <RVA>0x%x</RVA>\n", SmiHandlerStruct->CallerAddr - ImageStruct->ImageBase);\r
+          Print(L"         <RVA>0x%x</RVA>\n", (UINTN) (SmiHandlerStruct->CallerAddr - ImageStruct->ImageBase));\r
         }\r
         Print(L"      </Caller>\n", SmiHandlerStruct->Handler);\r
         SmiHandlerStruct = (VOID *)((UINTN)SmiHandlerStruct + SmiHandlerStruct->Length);\r
         }\r
         Print(L"      </Caller>\n", SmiHandlerStruct->Handler);\r
         SmiHandlerStruct = (VOID *)((UINTN)SmiHandlerStruct + SmiHandlerStruct->Length);\r
index 49eba945fd9ace213113938c02c7f835905f4945..f41353a6b82f4a53932c3af24d28ca7eda308740 100644 (file)
@@ -33,14 +33,17 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #include "PiSmmCore.h"\r
 \r
 \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
 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
 } 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 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
 \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
 **/\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
   )\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
     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
     }\r
   }\r
 \r
@@ -222,7 +225,7 @@ AddressToImageStruct(
 \r
   @return image reference index\r
 **/\r
 \r
   @return image reference index\r
 **/\r
-UINTN\r
+UINT32\r
 AddressToImageRef(\r
   IN UINTN  Address\r
   )\r
 AddressToImageRef(\r
   IN UINTN  Address\r
   )\r
@@ -233,7 +236,7 @@ AddressToImageRef(
   if (ImageStruct != NULL) {\r
     return ImageStruct->ImageRef;\r
   }\r
   if (ImageStruct != NULL) {\r
     return ImageStruct->ImageRef;\r
   }\r
-  return (UINTN)-1;\r
+  return (UINT32)-1;\r
 }\r
 \r
 /**\r
 }\r
 \r
 /**\r
@@ -252,11 +255,11 @@ GetSmmLoadedImage(
   EFI_LOADED_IMAGE_PROTOCOL  *LoadedImage;\r
   CHAR16                     *PathStr;\r
   EFI_SMM_DRIVER_ENTRY       *LoadedImagePrivate;\r
   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
   VOID                       *EntryPointInImage;\r
   EFI_GUID                   Guid;\r
   CHAR8                      *PdbString;\r
-  UINTN                      RealImageBase;\r
+  PHYSICAL_ADDRESS           RealImageBase;\r
 \r
   HandleBufferSize = 0;\r
   HandleBuffer = NULL;\r
 \r
   HandleBufferSize = 0;\r
   HandleBuffer = NULL;\r
@@ -286,7 +289,7 @@ GetSmmLoadedImage(
   }\r
 \r
   NoHandles = HandleBufferSize/sizeof(EFI_HANDLE);\r
   }\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
   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
     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
         //\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
         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
     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
     }\r
     DEBUG ((DEBUG_INFO, ")\n"));\r
 \r
@@ -334,7 +337,7 @@ GetSmmLoadedImage(
     }\r
     DEBUG ((DEBUG_INFO, "       (%s)\n", PathStr));\r
 \r
     }\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
   }\r
 \r
 Done:\r
@@ -359,7 +362,7 @@ DumpSmiChildContext (
   CHAR16        *Str;\r
 \r
   if (CompareGuid (HandlerType, &gEfiSmmSwDispatch2ProtocolGuid)) {\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
   } 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
@@ -422,12 +425,12 @@ DumpSmiHandlerOnSmiEntry(
     }\r
     DEBUG ((DEBUG_INFO, "  Handler - 0x%x", SmiHandler->Handler));\r
     if (ImageStruct != NULL) {\r
     }\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
     }\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
     }\r
     DEBUG ((DEBUG_INFO, "\n"));\r
   }\r
@@ -533,11 +536,11 @@ GetSmmImageDatabaseSize(
   )\r
 {\r
   UINTN  Size;\r
   )\r
 {\r
   UINTN  Size;\r
-  UINT Index;\r
+  UINT32 Index;\r
 \r
 \r
-  Size = (sizeof(SMM_CORE_IMAGE_DATABASE_STRUCTURE)) * mImageStructCount;\r
+  Size = 0;\r
   for (Index = 0; Index < mImageStructCount; Index++) {\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
   }\r
   return Size;\r
 }\r
@@ -564,7 +567,7 @@ GetSmmSmiHandlerSizeOnSmiEntry(
        ListEntry != &SmiEntry->SmiHandlers;\r
        ListEntry = ListEntry->ForwardLink) {\r
     SmiHandler = CR(ListEntry, SMI_HANDLER, Link, SMI_HANDLER_SIGNATURE);\r
        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
   }\r
 \r
   return Size;\r
@@ -640,11 +643,11 @@ GetSmmImageDatabaseData (
     if (Size >= ExpectedSize) {\r
       return 0;\r
     }\r
     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
       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->Header.Revision = SMM_CORE_IMAGE_DATABASE_REVISION;\r
     CopyGuid(&ImageStruct->FileGuid, &mImageStruct[Index].FileGuid);\r
     ImageStruct->ImageRef = mImageStruct[Index].ImageRef;\r
@@ -658,7 +661,7 @@ GetSmmImageDatabaseData (
       ImageStruct->PdbStringOffset = 0;\r
     }\r
     ImageStruct = (SMM_CORE_IMAGE_DATABASE_STRUCTURE *)((UINTN)ImageStruct + ImageStruct->Header.Length);\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
   }\r
 \r
   if (ExpectedSize != Size) {\r
@@ -682,7 +685,7 @@ GetSmmSmiHandlerDataOnSmiEntry(
   IN     SMI_ENTRY       *SmiEntry,\r
   IN OUT VOID            *Data,\r
   IN     UINTN           MaxSize,\r
   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
   )\r
 {\r
   SMM_CORE_SMI_HANDLER_STRUCTURE   *SmiHandlerStruct;\r
@@ -702,11 +705,11 @@ GetSmmSmiHandlerDataOnSmiEntry(
       *Count = 0;\r
       return 0;\r
     }\r
       *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
       *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
     SmiHandlerStruct->CallerAddr = (UINTN)SmiHandler->CallerAddr;\r
     SmiHandlerStruct->Handler = (UINTN)SmiHandler->Handler;\r
     SmiHandlerStruct->ImageRef = AddressToImageRef((UINTN)SmiHandler->Handler);\r
@@ -717,7 +720,7 @@ GetSmmSmiHandlerDataOnSmiEntry(
     } else {\r
       SmiHandlerStruct->ContextBufferOffset = 0;\r
     }\r
     } 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
     SmiHandlerStruct = (SMM_CORE_SMI_HANDLER_STRUCTURE *)((UINTN)SmiHandlerStruct + SmiHandlerStruct->Length);\r
     *Count = *Count + 1;\r
   }\r
@@ -748,7 +751,7 @@ GetSmmSmiDatabaseData(
   SMI_ENTRY                         *SmiEntry;\r
   UINTN                             Size;\r
   UINTN                             SmiHandlerSize;\r
   SMI_ENTRY                         *SmiEntry;\r
   UINTN                             Size;\r
   UINTN                             SmiHandlerSize;\r
-  UINT                            SmiHandlerCount;\r
+  UINT32                            SmiHandlerCount;\r
 \r
   SmiStruct = Data;\r
   Size = 0;\r
 \r
   SmiStruct = Data;\r
   Size = 0;\r
@@ -1132,6 +1135,36 @@ ConvertSmiHandlerUsbContext (
   return SmiHandlerUsbContext;\r
 }\r
 \r
   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
 /**\r
   This function is called by SmmChildDispatcher module to report\r
   a new SMI handler is registered, to SmmCore.\r
@@ -1186,6 +1219,8 @@ SmiHandlerProfileRegisterHandler (
   if (Context != NULL) {\r
     if (CompareGuid (HandlerGuid, &gEfiSmmUsbDispatch2ProtocolGuid)) {\r
       SmiHandler->Context = ConvertSmiHandlerUsbContext (Context, ContextSize, &SmiHandler->ContextSize);\r
   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
     } else {\r
       SmiHandler->Context = AllocateCopyPool (ContextSize, Context);\r
     }\r
@@ -1261,6 +1296,8 @@ SmiHandlerProfileUnregisterHandler (
   if (Context != NULL) {\r
     if (CompareGuid (HandlerGuid, &gEfiSmmUsbDispatch2ProtocolGuid)) {\r
       SearchContext = ConvertSmiHandlerUsbContext (Context, ContextSize, &SearchContextSize);\r
   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
     }\r
   }\r
 \r
index c5d29e889234295c2837cfafbb016af238494698..ba41393cf2e2f5b3593f4e04983bb9ad90149185 100644 (file)
@@ -25,12 +25,11 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Protocol/SmmSxDispatch2.h>\r
 #include <Protocol/SmmUsbDispatch2.h>\r
 \r
 #include <Protocol/SmmSxDispatch2.h>\r
 #include <Protocol/SmmUsbDispatch2.h>\r
 \r
-#pragma pack(1)\r
-\r
 typedef struct {\r
   UINT32                       Signature;\r
   UINT32                       Length;\r
   UINT32                       Revision;\r
 typedef struct {\r
   UINT32                       Signature;\r
   UINT32                       Length;\r
   UINT32                       Revision;\r
+  UINT8                        Reserved[4];\r
 } SMM_CORE_DATABASE_COMMON_HEADER;\r
 \r
 #define SMM_CORE_IMAGE_DATABASE_SIGNATURE SIGNATURE_32 ('S','C','I','D')\r
 } SMM_CORE_DATABASE_COMMON_HEADER;\r
 \r
 #define SMM_CORE_IMAGE_DATABASE_SIGNATURE SIGNATURE_32 ('S','C','I','D')\r
@@ -39,12 +38,12 @@ typedef struct {
 typedef struct {\r
   SMM_CORE_DATABASE_COMMON_HEADER     Header;\r
   EFI_GUID                            FileGuid;\r
 typedef struct {\r
   SMM_CORE_DATABASE_COMMON_HEADER     Header;\r
   EFI_GUID                            FileGuid;\r
-  UINTN                               ImageRef;\r
-  UINTN                               EntryPoint;\r
-  UINTN                               ImageBase;\r
-  UINTN                               ImageSize;\r
+  PHYSICAL_ADDRESS                    EntryPoint;\r
+  PHYSICAL_ADDRESS                    ImageBase;\r
+  UINT64                              ImageSize;\r
+  UINT32                              ImageRef;\r
   UINT16                              PdbStringOffset;\r
   UINT16                              PdbStringOffset;\r
-  UINT8                               Reserved2[6];\r
+  UINT8                               Reserved[2];\r
 //CHAR8                               PdbString[];\r
 } SMM_CORE_IMAGE_DATABASE_STRUCTURE;\r
 \r
 //CHAR8                               PdbString[];\r
 } SMM_CORE_IMAGE_DATABASE_STRUCTURE;\r
 \r
@@ -64,7 +63,7 @@ typedef enum {
 //   NULL\r
 // Context for SmmCoreSmiHandlerCategoryHardwareHandler:\r
 //   (NOTE: The context field should NOT include any data pointer.)\r
 //   NULL\r
 // Context for SmmCoreSmiHandlerCategoryHardwareHandler:\r
 //   (NOTE: The context field should NOT include any data pointer.)\r
-//   gEfiSmmSwDispatch2ProtocolGuid:            EFI_SMM_SW_REGISTER_CONTEXT\r
+//   gEfiSmmSwDispatch2ProtocolGuid:            (EFI_SMM_SW_REGISTER_CONTEXT => SMI_HANDLER_PROFILE_SW_REGISTER_CONTEXT)\r
 //   gEfiSmmSxDispatch2ProtocolGuid:            EFI_SMM_SX_REGISTER_CONTEXT\r
 //   gEfiSmmPowerButtonDispatch2ProtocolGuid:   EFI_SMM_POWER_BUTTON_REGISTER_CONTEXT\r
 //   gEfiSmmStandbyButtonDispatch2ProtocolGuid: EFI_SMM_STANDBY_BUTTON_REGISTER_CONTEXT\r
 //   gEfiSmmSxDispatch2ProtocolGuid:            EFI_SMM_SX_REGISTER_CONTEXT\r
 //   gEfiSmmPowerButtonDispatch2ProtocolGuid:   EFI_SMM_POWER_BUTTON_REGISTER_CONTEXT\r
 //   gEfiSmmStandbyButtonDispatch2ProtocolGuid: EFI_SMM_STANDBY_BUTTON_REGISTER_CONTEXT\r
@@ -81,21 +80,25 @@ typedef struct {
 } SMI_HANDLER_PROFILE_USB_REGISTER_CONTEXT;\r
 \r
 typedef struct {\r
 } SMI_HANDLER_PROFILE_USB_REGISTER_CONTEXT;\r
 \r
 typedef struct {\r
-  UINT32     Length;\r
-  UINTN      CallerAddr;\r
-  UINTN      Handler;\r
-  UINTN      ImageRef;\r
-  UINT16     ContextBufferOffset;\r
-  UINT8      Reserved2[2];\r
-  UINT32     ContextBufferSize;\r
-//UINT8      ContextBuffer[];\r
+  UINT64                    SwSmiInputValue;\r
+} SMI_HANDLER_PROFILE_SW_REGISTER_CONTEXT;\r
+\r
+typedef struct {\r
+  UINT32                Length;\r
+  UINT32                ImageRef;\r
+  PHYSICAL_ADDRESS      CallerAddr;\r
+  PHYSICAL_ADDRESS      Handler;\r
+  UINT16                ContextBufferOffset;\r
+  UINT8                 Reserved[2];\r
+  UINT32                ContextBufferSize;\r
+//UINT8                 ContextBuffer[];\r
 } SMM_CORE_SMI_HANDLER_STRUCTURE;\r
 \r
 typedef struct {\r
   SMM_CORE_DATABASE_COMMON_HEADER     Header;\r
 } SMM_CORE_SMI_HANDLER_STRUCTURE;\r
 \r
 typedef struct {\r
   SMM_CORE_DATABASE_COMMON_HEADER     Header;\r
-  UINT32                              HandlerCategory;\r
   EFI_GUID                            HandlerType;\r
   EFI_GUID                            HandlerType;\r
-  UINTN                               HandlerCount;\r
+  UINT32                              HandlerCategory;\r
+  UINT32                              HandlerCount;\r
 //SMM_CORE_SMI_HANDLER_STRUCTURE      Handler[HandlerCount];\r
 } SMM_CORE_SMI_DATABASE_STRUCTURE;\r
 \r
 //SMM_CORE_SMI_HANDLER_STRUCTURE      Handler[HandlerCount];\r
 } SMM_CORE_SMI_DATABASE_STRUCTURE;\r
 \r
@@ -144,8 +147,6 @@ typedef struct {
 \r
 #define SMI_HANDLER_PROFILE_GUID {0x49174342, 0x7108, 0x409b, {0x8b, 0xbe, 0x65, 0xfd, 0xa8, 0x53, 0x89, 0xf5}}\r
 \r
 \r
 #define SMI_HANDLER_PROFILE_GUID {0x49174342, 0x7108, 0x409b, {0x8b, 0xbe, 0x65, 0xfd, 0xa8, 0x53, 0x89, 0xf5}}\r
 \r
-#pragma pack()\r
-\r
 extern EFI_GUID gSmiHandlerProfileGuid;\r
 \r
 typedef struct _SMI_HANDLER_PROFILE_PROTOCOL  SMI_HANDLER_PROFILE_PROTOCOL;\r
 extern EFI_GUID gSmiHandlerProfileGuid;\r
 \r
 typedef struct _SMI_HANDLER_PROFILE_PROTOCOL  SMI_HANDLER_PROFILE_PROTOCOL;\r