From: "Yao, Jiewen" <jiewen.yao@intel.com>
To: "edk2-devel@lists.01.org" <edk2-devel@lists.01.org>
Subject: Re: [PATCH] MdeModulePkg SmiHandlerProfile: Use fixed data type in data structure
Date: Tue, 23 May 2017 07:03:38 +0000 [thread overview]
Message-ID: <74D8A39837DF1E4DA445A8C0B3885C503A953FB0@shsmsx102.ccr.corp.intel.com> (raw)
In-Reply-To: <0C09AFA07DD0434D9E2A0C6AEB0483103B8C4CA8@shsmsx102.ccr.corp.intel.com>
Reviewed-by: Jiewen.yao@intel.com
> -----Original Message-----
> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of Star
> Zeng
> Sent: Tuesday, May 23, 2017 1:20 PM
> To: edk2-devel@lists.01.org
> Cc: Yao, Jiewen <jiewen.yao@intel.com>; Zeng, Star <star.zeng@intel.com>
> Subject: [edk2] [PATCH] MdeModulePkg SmiHandlerProfile: Use fixed data type
> in data structure
>
> 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>
> ---
> .../SmiHandlerProfileInfo/SmiHandlerProfileInfo.c | 14 +--
> MdeModulePkg/Core/PiSmmCore/SmiHandlerProfile.c | 115
> ++++++++++++++-------
> MdeModulePkg/Include/Guid/SmiHandlerProfile.h | 41 ++++----
> 3 files changed, 104 insertions(+), 66 deletions(-)
>
> diff --git
> a/MdeModulePkg/Application/SmiHandlerProfileInfo/SmiHandlerProfileInfo.c
> b/MdeModulePkg/Application/SmiHandlerProfileInfo/SmiHandlerProfileInfo.c
> index 338671374c72..96e9977aad0c 100644
> ---
> a/MdeModulePkg/Application/SmiHandlerProfileInfo/SmiHandlerProfileInfo.c
> +++ b/MdeModulePkg/Application/SmiHandlerProfileInfo/SmiHandlerProfileIn
> +++ fo.c
> @@ -348,9 +348,9 @@ DumpSmmLoadedImage(
> if (ImageStruct->Header.Signature ==
> SMM_CORE_IMAGE_DATABASE_SIGNATURE) {
> NameString = GetDriverNameString (ImageStruct);
> Print(L" <Image Name=\"%a\"", NameString);
> - Print(L" Base=\"0x%x\" Size=\"0x%x\"", ImageStruct->ImageBase,
> ImageStruct->ImageSize);
> + Print(L" Base=\"0x%lx\" Size=\"0x%lx\"", ImageStruct->ImageBase,
> + ImageStruct->ImageSize);
> if (ImageStruct->EntryPoint != 0) {
> - Print(L" EntryPoint=\"0x%x\"", ImageStruct->EntryPoint);
> + Print(L" EntryPoint=\"0x%lx\"", ImageStruct->EntryPoint);
> }
> Print(L" FvFile=\"%g\"", &ImageStruct->FileGuid);
> Print(L" RefId=\"0x%x\"", ImageStruct->ImageRef); @@ -540,7 +540,7
> @@ DumpSmiChildContext (
> CHAR16 *Str;
>
> if (CompareGuid (HandlerType, &gEfiSmmSwDispatch2ProtocolGuid)) {
> - Print(L" SwSmi=\"0x%x\"", ((EFI_SMM_SW_REGISTER_CONTEXT
> *)Context)->SwSmiInputValue);
> + Print(L" SwSmi=\"0x%lx\"",
> + ((SMI_HANDLER_PROFILE_SW_REGISTER_CONTEXT
> + *)Context)->SwSmiInputValue);
> } else if (CompareGuid (HandlerType, &gEfiSmmSxDispatch2ProtocolGuid)) {
> Print(L" SxType=\"%a\"",
> SxTypeToString(((EFI_SMM_SX_REGISTER_CONTEXT *)Context)->Type));
> Print(L" SxPhase=\"%a\"",
> SxPhaseToString(((EFI_SMM_SX_REGISTER_CONTEXT *)Context)->Phase)); @@
> -609,14 +609,14 @@ DumpSmiHandler(
> Print(L" <Pdb>%a</Pdb>\n", (UINT8 *)ImageStruct +
> ImageStruct->PdbStringOffset);
> }
> Print(L" </Module>\n");
> - Print(L" <Handler Address=\"0x%x\">\n",
> SmiHandlerStruct->Handler);
> + Print(L" <Handler Address=\"0x%lx\">\n",
> SmiHandlerStruct->Handler);
> if (ImageStruct != NULL) {
> - Print(L" <RVA>0x%x</RVA>\n",
> SmiHandlerStruct->Handler - ImageStruct->ImageBase);
> + Print(L" <RVA>0x%x</RVA>\n", (UINTN)
> (SmiHandlerStruct->Handler - ImageStruct->ImageBase));
> }
> Print(L" </Handler>\n", SmiHandlerStruct->Handler);
> - Print(L" <Caller Address=\"0x%x\">\n",
> SmiHandlerStruct->CallerAddr);
> + Print(L" <Caller Address=\"0x%lx\">\n",
> SmiHandlerStruct->CallerAddr);
> if (ImageStruct != NULL) {
> - Print(L" <RVA>0x%x</RVA>\n",
> SmiHandlerStruct->CallerAddr - ImageStruct->ImageBase);
> + Print(L" <RVA>0x%x</RVA>\n", (UINTN)
> (SmiHandlerStruct->CallerAddr - ImageStruct->ImageBase));
> }
> Print(L" </Caller>\n", SmiHandlerStruct->Handler);
> SmiHandlerStruct = (VOID *)((UINTN)SmiHandlerStruct +
> SmiHandlerStruct->Length); diff --git
> a/MdeModulePkg/Core/PiSmmCore/SmiHandlerProfile.c
> b/MdeModulePkg/Core/PiSmmCore/SmiHandlerProfile.c
> index 49eba945fd9a..3a031183b81f 100644
> --- a/MdeModulePkg/Core/PiSmmCore/SmiHandlerProfile.c
> +++ b/MdeModulePkg/Core/PiSmmCore/SmiHandlerProfile.c
> @@ -33,14 +33,17 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY
> KIND, EITHER EXPRESS OR IMPLIED.
>
> #include "PiSmmCore.h"
>
> +#define GET_OCCUPIED_SIZE(ActualSize, Alignment) \
> + ((ActualSize) + (((Alignment) - ((ActualSize) & ((Alignment) - 1))) &
> +((Alignment) - 1)))
> +
> typedef struct {
> - EFI_GUID FileGuid;
> - UINTN ImageRef;
> - UINTN EntryPoint;
> - UINTN ImageBase;
> - UINTN ImageSize;
> - UINTN PdbStringSize;
> - CHAR8 *PdbString;
> + EFI_GUID FileGuid;
> + PHYSICAL_ADDRESS EntryPoint;
> + PHYSICAL_ADDRESS ImageBase;
> + UINT64 ImageSize;
> + UINT32 ImageRef;
> + UINT16 PdbStringSize;
> + CHAR8 *PdbString;
> } IMAGE_STRUCT;
>
> /**
> @@ -89,8 +92,8 @@ GLOBAL_REMOVE_IF_UNREFERENCED LIST_ENTRY
> *mSmmCoreSmiEntryList = &mSmiEntry
> GLOBAL_REMOVE_IF_UNREFERENCED LIST_ENTRY
> *mSmmCoreHardwareSmiEntryList = &mHardwareSmiEntryList;
>
> GLOBAL_REMOVE_IF_UNREFERENCED IMAGE_STRUCT *mImageStruct;
> -GLOBAL_REMOVE_IF_UNREFERENCED UINTN
> mImageStructCountMax;
> -GLOBAL_REMOVE_IF_UNREFERENCED UINTN mImageStructCount;
> +GLOBAL_REMOVE_IF_UNREFERENCED UINT32
> mImageStructCountMax;
> +GLOBAL_REMOVE_IF_UNREFERENCED UINT32 mImageStructCount;
>
> GLOBAL_REMOVE_IF_UNREFERENCED VOID *mSmiHandlerProfileDatabase;
> GLOBAL_REMOVE_IF_UNREFERENCED UINTN
> mSmiHandlerProfileDatabaseSize; @@ -162,11 +165,11 @@ GetDriverGuid
> ( **/ VOID AddImageStruct(
> - IN UINTN ImageBase,
> - IN UINTN ImageSize,
> - IN UINTN EntryPoint,
> - IN EFI_GUID *Guid,
> - IN CHAR8 *PdbString
> + IN PHYSICAL_ADDRESS ImageBase,
> + IN UINT64 ImageSize,
> + IN PHYSICAL_ADDRESS EntryPoint,
> + IN EFI_GUID *Guid,
> + IN CHAR8 *PdbString
> )
> {
> UINTN PdbStringSize;
> @@ -185,7 +188,7 @@ AddImageStruct(
> PdbStringSize = AsciiStrSize(PdbString);
> mImageStruct[mImageStructCount].PdbString = AllocateCopyPool
> (PdbStringSize, PdbString);
> if (mImageStruct[mImageStructCount].PdbString != NULL) {
> - mImageStruct[mImageStructCount].PdbStringSize = PdbStringSize;
> + mImageStruct[mImageStructCount].PdbStringSize = (UINT16)
> + PdbStringSize;
> }
> }
>
> @@ -222,7 +225,7 @@ AddressToImageStruct(
>
> @return image reference index
> **/
> -UINTN
> +UINT32
> AddressToImageRef(
> IN UINTN Address
> )
> @@ -252,11 +255,11 @@ GetSmmLoadedImage(
> EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
> CHAR16 *PathStr;
> EFI_SMM_DRIVER_ENTRY *LoadedImagePrivate;
> - UINTN EntryPoint;
> + PHYSICAL_ADDRESS EntryPoint;
> VOID *EntryPointInImage;
> EFI_GUID Guid;
> CHAR8 *PdbString;
> - UINTN RealImageBase;
> + PHYSICAL_ADDRESS RealImageBase;
>
> HandleBufferSize = 0;
> HandleBuffer = NULL;
> @@ -286,7 +289,7 @@ GetSmmLoadedImage(
> }
>
> NoHandles = HandleBufferSize/sizeof(EFI_HANDLE);
> - mImageStructCountMax = NoHandles;
> + mImageStructCountMax = (UINT32) NoHandles;
> mImageStruct = AllocateZeroPool(mImageStructCountMax *
> sizeof(IMAGE_STRUCT));
> if (mImageStruct == NULL) {
> goto Done;
> @@ -309,8 +312,8 @@ GetSmmLoadedImage(
> LoadedImagePrivate = BASE_CR(LoadedImage, EFI_SMM_DRIVER_ENTRY,
> SmmLoadedImage);
> RealImageBase = (UINTN)LoadedImage->ImageBase;
> if (LoadedImagePrivate->Signature ==
> EFI_SMM_DRIVER_ENTRY_SIGNATURE) {
> - EntryPoint = (UINTN)LoadedImagePrivate->ImageEntryPoint;
> - if ((EntryPoint != 0) && ((EntryPoint < (UINTN)LoadedImage->ImageBase)
> || (EntryPoint >= ((UINTN)LoadedImage->ImageBase +
> (UINTN)LoadedImage->ImageSize)))) {
> + EntryPoint = LoadedImagePrivate->ImageEntryPoint;
> + if ((EntryPoint != 0) && ((EntryPoint <
> + (UINTN)LoadedImage->ImageBase) || (EntryPoint >=
> + ((UINTN)LoadedImage->ImageBase + LoadedImage->ImageSize)))) {
> //
> // If the EntryPoint is not in the range of image buffer, it should come
> from emulation environment.
> // So patch ImageBuffer here to align the EntryPoint.
> @@ -320,9 +323,9 @@ GetSmmLoadedImage(
> RealImageBase = (UINTN)LoadedImage->ImageBase + EntryPoint -
> (UINTN)EntryPointInImage;
> }
> }
> - DEBUG ((DEBUG_INFO, "(0x%x - 0x%x", RealImageBase,
> (UINTN)LoadedImage->ImageSize));
> + DEBUG ((DEBUG_INFO, "(0x%lx - 0x%lx", RealImageBase,
> + LoadedImage->ImageSize));
> if (EntryPoint != 0) {
> - DEBUG ((DEBUG_INFO, ", EntryPoint:0x%x", EntryPoint));
> + DEBUG ((DEBUG_INFO, ", EntryPoint:0x%lx", EntryPoint));
> }
> DEBUG ((DEBUG_INFO, ")\n"));
>
> @@ -334,7 +337,7 @@ GetSmmLoadedImage(
> }
> DEBUG ((DEBUG_INFO, " (%s)\n", PathStr));
>
> - AddImageStruct((UINTN)RealImageBase,
> (UINTN)LoadedImage->ImageSize, EntryPoint, &Guid, PdbString);
> + AddImageStruct(RealImageBase, LoadedImage->ImageSize, EntryPoint,
> + &Guid, PdbString);
> }
>
> Done:
> @@ -359,7 +362,7 @@ DumpSmiChildContext (
> CHAR16 *Str;
>
> if (CompareGuid (HandlerType, &gEfiSmmSwDispatch2ProtocolGuid)) {
> - DEBUG ((DEBUG_INFO, " SwSmi - 0x%x\n",
> ((EFI_SMM_SW_REGISTER_CONTEXT *)Context)->SwSmiInputValue));
> + DEBUG ((DEBUG_INFO, " SwSmi - 0x%lx\n",
> + ((SMI_HANDLER_PROFILE_SW_REGISTER_CONTEXT
> + *)Context)->SwSmiInputValue));
> } else if (CompareGuid (HandlerType, &gEfiSmmSxDispatch2ProtocolGuid)) {
> DEBUG ((DEBUG_INFO, " SxType - 0x%x\n",
> ((EFI_SMM_SX_REGISTER_CONTEXT *)Context)->Type));
> DEBUG ((DEBUG_INFO, " SxPhase - 0x%x\n",
> ((EFI_SMM_SX_REGISTER_CONTEXT *)Context)->Phase)); @@ -422,12 +425,12
> @@ DumpSmiHandlerOnSmiEntry(
> }
> DEBUG ((DEBUG_INFO, " Handler - 0x%x", SmiHandler->Handler));
> if (ImageStruct != NULL) {
> - DEBUG ((DEBUG_INFO, " <== RVA - 0x%x", (UINTN)SmiHandler->Handler
> - ImageStruct->ImageBase));
> + DEBUG ((DEBUG_INFO, " <== RVA - 0x%x",
> (UINTN)SmiHandler->Handler
> + - (UINTN) ImageStruct->ImageBase));
> }
> DEBUG ((DEBUG_INFO, "\n"));
> DEBUG ((DEBUG_INFO, " CallerAddr - 0x%x", SmiHandler->CallerAddr));
> if (ImageStruct != NULL) {
> - DEBUG ((DEBUG_INFO, " <== RVA - 0x%x", SmiHandler->CallerAddr -
> ImageStruct->ImageBase));
> + DEBUG ((DEBUG_INFO, " <== RVA - 0x%x", SmiHandler->CallerAddr -
> + (UINTN) ImageStruct->ImageBase));
> }
> DEBUG ((DEBUG_INFO, "\n"));
> }
> @@ -533,11 +536,11 @@ GetSmmImageDatabaseSize(
> )
> {
> UINTN Size;
> - UINTN Index;
> + UINT32 Index;
>
> - Size = (sizeof(SMM_CORE_IMAGE_DATABASE_STRUCTURE)) *
> mImageStructCount;
> + Size = 0;
> for (Index = 0; Index < mImageStructCount; Index++) {
> - Size += mImageStruct[Index].PdbStringSize;
> + Size += sizeof(SMM_CORE_IMAGE_DATABASE_STRUCTURE) +
> + GET_OCCUPIED_SIZE (mImageStruct[Index].PdbStringSize, sizeof
> + (UINT64));
> }
> return Size;
> }
> @@ -564,7 +567,7 @@ GetSmmSmiHandlerSizeOnSmiEntry(
> ListEntry != &SmiEntry->SmiHandlers;
> ListEntry = ListEntry->ForwardLink) {
> SmiHandler = CR(ListEntry, SMI_HANDLER, Link,
> SMI_HANDLER_SIGNATURE);
> - Size += sizeof(SMM_CORE_SMI_HANDLER_STRUCTURE) +
> SmiHandler->ContextSize;
> + Size += sizeof(SMM_CORE_SMI_HANDLER_STRUCTURE) +
> GET_OCCUPIED_SIZE
> + (SmiHandler->ContextSize, sizeof (UINT64));
> }
>
> return Size;
> @@ -640,11 +643,11 @@ GetSmmImageDatabaseData (
> if (Size >= ExpectedSize) {
> return 0;
> }
> - if (sizeof(SMM_CORE_IMAGE_DATABASE_STRUCTURE) +
> mImageStruct[Index].PdbStringSize > ExpectedSize - Size) {
> + if (sizeof(SMM_CORE_IMAGE_DATABASE_STRUCTURE) +
> GET_OCCUPIED_SIZE
> + (mImageStruct[Index].PdbStringSize, sizeof (UINT64)) > ExpectedSize -
> + Size) {
> return 0;
> }
> ImageStruct->Header.Signature =
> SMM_CORE_IMAGE_DATABASE_SIGNATURE;
> - ImageStruct->Header.Length =
> (UINT32)(sizeof(SMM_CORE_IMAGE_DATABASE_STRUCTURE) +
> mImageStruct[Index].PdbStringSize);
> + ImageStruct->Header.Length =
> + (UINT32)(sizeof(SMM_CORE_IMAGE_DATABASE_STRUCTURE) +
> GET_OCCUPIED_SIZE
> + (mImageStruct[Index].PdbStringSize, sizeof (UINT64)));
> ImageStruct->Header.Revision =
> SMM_CORE_IMAGE_DATABASE_REVISION;
> CopyGuid(&ImageStruct->FileGuid, &mImageStruct[Index].FileGuid);
> ImageStruct->ImageRef = mImageStruct[Index].ImageRef; @@ -658,7
> +661,7 @@ GetSmmImageDatabaseData (
> ImageStruct->PdbStringOffset = 0;
> }
> ImageStruct = (SMM_CORE_IMAGE_DATABASE_STRUCTURE
> *)((UINTN)ImageStruct + ImageStruct->Header.Length);
> - Size += sizeof(SMM_CORE_IMAGE_DATABASE_STRUCTURE) +
> mImageStruct[Index].PdbStringSize;
> + Size += sizeof(SMM_CORE_IMAGE_DATABASE_STRUCTURE) +
> + GET_OCCUPIED_SIZE (mImageStruct[Index].PdbStringSize, sizeof
> + (UINT64));
> }
>
> if (ExpectedSize != Size) {
> @@ -682,7 +685,7 @@ GetSmmSmiHandlerDataOnSmiEntry(
> IN SMI_ENTRY *SmiEntry,
> IN OUT VOID *Data,
> IN UINTN MaxSize,
> - OUT UINTN *Count
> + OUT UINT32 *Count
> )
> {
> SMM_CORE_SMI_HANDLER_STRUCTURE *SmiHandlerStruct;
> @@ -702,11 +705,11 @@ GetSmmSmiHandlerDataOnSmiEntry(
> *Count = 0;
> return 0;
> }
> - if (sizeof(SMM_CORE_SMI_HANDLER_STRUCTURE) +
> SmiHandler->ContextSize > MaxSize - Size) {
> + if (sizeof(SMM_CORE_SMI_HANDLER_STRUCTURE) + GET_OCCUPIED_SIZE
> + (SmiHandler->ContextSize, sizeof (UINT64)) > MaxSize - Size) {
> *Count = 0;
> return 0;
> }
> - SmiHandlerStruct->Length =
> (UINT32)(sizeof(SMM_CORE_SMI_HANDLER_STRUCTURE) +
> SmiHandler->ContextSize);
> + SmiHandlerStruct->Length =
> + (UINT32)(sizeof(SMM_CORE_SMI_HANDLER_STRUCTURE) +
> GET_OCCUPIED_SIZE
> + (SmiHandler->ContextSize, sizeof (UINT64)));
> SmiHandlerStruct->CallerAddr = (UINTN)SmiHandler->CallerAddr;
> SmiHandlerStruct->Handler = (UINTN)SmiHandler->Handler;
> SmiHandlerStruct->ImageRef =
> AddressToImageRef((UINTN)SmiHandler->Handler);
> @@ -717,7 +720,7 @@ GetSmmSmiHandlerDataOnSmiEntry(
> } else {
> SmiHandlerStruct->ContextBufferOffset = 0;
> }
> - Size += sizeof(SMM_CORE_SMI_HANDLER_STRUCTURE) +
> SmiHandler->ContextSize;
> + Size += sizeof(SMM_CORE_SMI_HANDLER_STRUCTURE) +
> GET_OCCUPIED_SIZE
> + (SmiHandler->ContextSize, sizeof (UINT64));
> SmiHandlerStruct = (SMM_CORE_SMI_HANDLER_STRUCTURE
> *)((UINTN)SmiHandlerStruct + SmiHandlerStruct->Length);
> *Count = *Count + 1;
> }
> @@ -748,7 +751,7 @@ GetSmmSmiDatabaseData(
> SMI_ENTRY *SmiEntry;
> UINTN Size;
> UINTN SmiHandlerSize;
> - UINTN SmiHandlerCount;
> + UINT32 SmiHandlerCount;
>
> SmiStruct = Data;
> Size = 0;
> @@ -1133,6 +1136,36 @@ ConvertSmiHandlerUsbContext ( }
>
> /**
> + Convert EFI_SMM_SW_REGISTER_CONTEXT to
> SMI_HANDLER_PROFILE_SW_REGISTER_CONTEXT.
> +
> + @param SwContext A pointer to
> EFI_SMM_SW_REGISTER_CONTEXT
> + @param SwContextSize The size of
> EFI_SMM_SW_REGISTER_CONTEXT in bytes
> + @param SmiHandlerSwContextSize The size of
> SMI_HANDLER_PROFILE_SW_REGISTER_CONTEXT in bytes
> +
> + @return SmiHandlerSwContext A pointer to
> SMI_HANDLER_PROFILE_SW_REGISTER_CONTEXT
> +**/
> +SMI_HANDLER_PROFILE_SW_REGISTER_CONTEXT *
> ConvertSmiHandlerSwContext (
> + IN EFI_SMM_SW_REGISTER_CONTEXT *SwContext,
> + IN UINTN SwContextSize,
> + OUT UINTN *SmiHandlerSwContextSize
> + )
> +{
> + SMI_HANDLER_PROFILE_SW_REGISTER_CONTEXT *SmiHandlerSwContext;
> +
> + ASSERT (SwContextSize == sizeof(EFI_SMM_SW_REGISTER_CONTEXT));
> +
> + SmiHandlerSwContext = AllocatePool (sizeof
> +(SMI_HANDLER_PROFILE_SW_REGISTER_CONTEXT));
> + if (SmiHandlerSwContext == NULL) {
> + *SmiHandlerSwContextSize = 0;
> + return NULL;
> + }
> + SmiHandlerSwContext->SwSmiInputValue = SwContext->SwSmiInputValue;
> + *SmiHandlerSwContextSize = sizeof
> +(SMI_HANDLER_PROFILE_SW_REGISTER_CONTEXT);
> + return SmiHandlerSwContext;
> +}
> +
> +/**
> This function is called by SmmChildDispatcher module to report
> a new SMI handler is registered, to SmmCore.
>
> @@ -1186,6 +1219,8 @@ SmiHandlerProfileRegisterHandler (
> if (Context != NULL) {
> if (CompareGuid (HandlerGuid, &gEfiSmmUsbDispatch2ProtocolGuid)) {
> SmiHandler->Context = ConvertSmiHandlerUsbContext (Context,
> ContextSize, &SmiHandler->ContextSize);
> + } else if (CompareGuid (HandlerGuid, &gEfiSmmSwDispatch2ProtocolGuid))
> {
> + SmiHandler->Context = ConvertSmiHandlerSwContext (Context,
> + ContextSize, &SmiHandler->ContextSize);
> } else {
> SmiHandler->Context = AllocateCopyPool (ContextSize, Context);
> }
> @@ -1261,6 +1296,8 @@ SmiHandlerProfileUnregisterHandler (
> if (Context != NULL) {
> if (CompareGuid (HandlerGuid, &gEfiSmmUsbDispatch2ProtocolGuid)) {
> SearchContext = ConvertSmiHandlerUsbContext (Context, ContextSize,
> &SearchContextSize);
> + } else if (CompareGuid (HandlerGuid, &gEfiSmmSwDispatch2ProtocolGuid))
> {
> + SearchContext = ConvertSmiHandlerSwContext (Context, ContextSize,
> + &SearchContextSize);
> }
> }
>
> diff --git a/MdeModulePkg/Include/Guid/SmiHandlerProfile.h
> b/MdeModulePkg/Include/Guid/SmiHandlerProfile.h
> index c5d29e889234..ba41393cf2e2 100644
> --- a/MdeModulePkg/Include/Guid/SmiHandlerProfile.h
> +++ b/MdeModulePkg/Include/Guid/SmiHandlerProfile.h
> @@ -25,12 +25,11 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY
> KIND, EITHER EXPRESS OR IMPLIED.
> #include <Protocol/SmmSxDispatch2.h>
> #include <Protocol/SmmUsbDispatch2.h>
>
> -#pragma pack(1)
> -
> typedef struct {
> UINT32 Signature;
> UINT32 Length;
> UINT32 Revision;
> + UINT8 Reserved[4];
> } SMM_CORE_DATABASE_COMMON_HEADER;
>
> #define SMM_CORE_IMAGE_DATABASE_SIGNATURE SIGNATURE_32
> ('S','C','I','D') @@ -39,12 +38,12 @@ typedef struct { typedef struct {
> SMM_CORE_DATABASE_COMMON_HEADER Header;
> EFI_GUID FileGuid;
> - UINTN ImageRef;
> - UINTN EntryPoint;
> - UINTN ImageBase;
> - UINTN ImageSize;
> + PHYSICAL_ADDRESS EntryPoint;
> + PHYSICAL_ADDRESS ImageBase;
> + UINT64 ImageSize;
> + UINT32 ImageRef;
> UINT16 PdbStringOffset;
> - UINT8 Reserved2[6];
> + UINT8 Reserved[2];
> //CHAR8 PdbString[];
> } SMM_CORE_IMAGE_DATABASE_STRUCTURE;
>
> @@ -64,7 +63,7 @@ typedef enum {
> // NULL
> // Context for SmmCoreSmiHandlerCategoryHardwareHandler:
> // (NOTE: The context field should NOT include any data pointer.)
> -// gEfiSmmSwDispatch2ProtocolGuid:
> EFI_SMM_SW_REGISTER_CONTEXT
> +// gEfiSmmSwDispatch2ProtocolGuid:
> (EFI_SMM_SW_REGISTER_CONTEXT =>
> SMI_HANDLER_PROFILE_SW_REGISTER_CONTEXT)
> // gEfiSmmSxDispatch2ProtocolGuid:
> EFI_SMM_SX_REGISTER_CONTEXT
> // gEfiSmmPowerButtonDispatch2ProtocolGuid:
> EFI_SMM_POWER_BUTTON_REGISTER_CONTEXT
> // gEfiSmmStandbyButtonDispatch2ProtocolGuid:
> EFI_SMM_STANDBY_BUTTON_REGISTER_CONTEXT
> @@ -81,21 +80,25 @@ typedef struct {
> } SMI_HANDLER_PROFILE_USB_REGISTER_CONTEXT;
>
> typedef struct {
> - UINT32 Length;
> - UINTN CallerAddr;
> - UINTN Handler;
> - UINTN ImageRef;
> - UINT16 ContextBufferOffset;
> - UINT8 Reserved2[2];
> - UINT32 ContextBufferSize;
> -//UINT8 ContextBuffer[];
> + UINT64 SwSmiInputValue;
> +} SMI_HANDLER_PROFILE_SW_REGISTER_CONTEXT;
> +
> +typedef struct {
> + UINT32 Length;
> + UINT32 ImageRef;
> + PHYSICAL_ADDRESS CallerAddr;
> + PHYSICAL_ADDRESS Handler;
> + UINT16 ContextBufferOffset;
> + UINT8 Reserved[2];
> + UINT32 ContextBufferSize;
> +//UINT8 ContextBuffer[];
> } SMM_CORE_SMI_HANDLER_STRUCTURE;
>
> typedef struct {
> SMM_CORE_DATABASE_COMMON_HEADER Header;
> - UINT32 HandlerCategory;
> EFI_GUID HandlerType;
> - UINTN HandlerCount;
> + UINT32 HandlerCategory;
> + UINT32 HandlerCount;
> //SMM_CORE_SMI_HANDLER_STRUCTURE Handler[HandlerCount];
> } SMM_CORE_SMI_DATABASE_STRUCTURE;
>
> @@ -144,8 +147,6 @@ typedef struct {
>
> #define SMI_HANDLER_PROFILE_GUID {0x49174342, 0x7108, 0x409b, {0x8b,
> 0xbe, 0x65, 0xfd, 0xa8, 0x53, 0x89, 0xf5}}
>
> -#pragma pack()
> -
> extern EFI_GUID gSmiHandlerProfileGuid;
>
> typedef struct _SMI_HANDLER_PROFILE_PROTOCOL
> SMI_HANDLER_PROFILE_PROTOCOL;
> --
> 2.7.0.windows.1
>
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel
prev parent reply other threads:[~2017-05-23 7:03 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-23 5:19 [PATCH] MdeModulePkg SmiHandlerProfile: Use fixed data type in data structure Star Zeng
[not found] ` <0C09AFA07DD0434D9E2A0C6AEB0483103B8C4CA8@shsmsx102.ccr.corp.intel.com>
2017-05-23 7:03 ` Yao, Jiewen [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=74D8A39837DF1E4DA445A8C0B3885C503A953FB0@shsmsx102.ccr.corp.intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox