MdeModulePkg/PiSmmCore: Install Protocol when S3 resume finished.
Install EdkiiSmmEndOfS3ResumeProtocol when S3 resume finished. S3ResumePei will send S3 resume finished event to SmmCore through communication buffer. V2 change: None. V3 change: 1. Uninstall the protocol right after install it to avoid run out of memory. Cc: Ruiyu Ni <ruiyu.ni@intel.com> Cc: Jiewen Yao <jiewen.yao@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Eric Dong <eric.dong@intel.com> Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com> Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
This commit is contained in:
		| @@ -75,13 +75,14 @@ BOOLEAN  mInLegacyBoot = FALSE; | |||||||
| // Table of SMI Handlers that are registered by the SMM Core when it is initialized | // Table of SMI Handlers that are registered by the SMM Core when it is initialized | ||||||
| // | // | ||||||
| SMM_CORE_SMI_HANDLERS  mSmmCoreSmiHandlers[] = { | SMM_CORE_SMI_HANDLERS  mSmmCoreSmiHandlers[] = { | ||||||
|   { SmmDriverDispatchHandler,   &gEfiEventDxeDispatchGuid,          NULL, TRUE  }, |   { SmmDriverDispatchHandler,   &gEfiEventDxeDispatchGuid,           NULL, TRUE  }, | ||||||
|   { SmmReadyToLockHandler,      &gEfiDxeSmmReadyToLockProtocolGuid, NULL, TRUE },  |   { SmmReadyToLockHandler,      &gEfiDxeSmmReadyToLockProtocolGuid,  NULL, TRUE },  | ||||||
|   { SmmLegacyBootHandler,       &gEfiEventLegacyBootGuid,           NULL, FALSE }, |   { SmmLegacyBootHandler,       &gEfiEventLegacyBootGuid,            NULL, FALSE }, | ||||||
|   { SmmExitBootServicesHandler, &gEfiEventExitBootServicesGuid,     NULL, FALSE }, |   { SmmExitBootServicesHandler, &gEfiEventExitBootServicesGuid,      NULL, FALSE }, | ||||||
|   { SmmReadyToBootHandler,      &gEfiEventReadyToBootGuid,          NULL, FALSE }, |   { SmmReadyToBootHandler,      &gEfiEventReadyToBootGuid,           NULL, FALSE }, | ||||||
|   { SmmEndOfDxeHandler,         &gEfiEndOfDxeEventGroupGuid,        NULL, TRUE }, |   { SmmEndOfDxeHandler,         &gEfiEndOfDxeEventGroupGuid,         NULL, TRUE }, | ||||||
|   { NULL,                       NULL,                               NULL, FALSE } |   { SmmEndOfS3ResumeHandler,    &gEdkiiSmmEndOfS3ResumeProtocolGuid, NULL, FALSE }, | ||||||
|  |   { NULL,                       NULL,                                NULL, FALSE } | ||||||
| }; | }; | ||||||
|  |  | ||||||
| UINTN                           mFullSmramRangeCount; | UINTN                           mFullSmramRangeCount; | ||||||
| @@ -382,6 +383,60 @@ SmmEndOfDxeHandler ( | |||||||
|   return Status; |   return Status; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |   Software SMI handler that is called when the EndOfS3Resume event is trigged. | ||||||
|  |   This function installs the SMM EndOfS3Resume Protocol so SMM Drivers are informed that | ||||||
|  |   S3 resume has finished. | ||||||
|  |  | ||||||
|  |   @param  DispatchHandle  The unique handle assigned to this handler by SmiHandlerRegister(). | ||||||
|  |   @param  Context         Points to an optional handler context which was specified when the handler was registered. | ||||||
|  |   @param  CommBuffer      A pointer to a collection of data in memory that will | ||||||
|  |                           be conveyed from a non-SMM environment into an SMM environment. | ||||||
|  |   @param  CommBufferSize  The size of the CommBuffer. | ||||||
|  |  | ||||||
|  |   @return Status Code | ||||||
|  |  | ||||||
|  | **/ | ||||||
|  | EFI_STATUS | ||||||
|  | EFIAPI | ||||||
|  | SmmEndOfS3ResumeHandler ( | ||||||
|  |   IN     EFI_HANDLE  DispatchHandle, | ||||||
|  |   IN     CONST VOID  *Context,        OPTIONAL | ||||||
|  |   IN OUT VOID        *CommBuffer,     OPTIONAL | ||||||
|  |   IN OUT UINTN       *CommBufferSize  OPTIONAL | ||||||
|  |   ) | ||||||
|  | { | ||||||
|  |   EFI_STATUS  Status; | ||||||
|  |   EFI_HANDLE  SmmHandle; | ||||||
|  |  | ||||||
|  |   DEBUG ((EFI_D_INFO, "SmmEndOfS3ResumeHandler\n")); | ||||||
|  |  | ||||||
|  |   // | ||||||
|  |   // Install SMM EndOfS3Resume protocol | ||||||
|  |   // | ||||||
|  |   SmmHandle = NULL; | ||||||
|  |   Status = SmmInstallProtocolInterface ( | ||||||
|  |              &SmmHandle, | ||||||
|  |              &gEdkiiSmmEndOfS3ResumeProtocolGuid, | ||||||
|  |              EFI_NATIVE_INTERFACE, | ||||||
|  |              NULL | ||||||
|  |              ); | ||||||
|  |   ASSERT_EFI_ERROR (Status); | ||||||
|  |  | ||||||
|  |   // | ||||||
|  |   // Uninstall the protocol here because the comsume just hook the | ||||||
|  |   // installation event. | ||||||
|  |   // | ||||||
|  |   Status = SmmUninstallProtocolInterface ( | ||||||
|  |            SmmHandle, | ||||||
|  |            &gEdkiiSmmEndOfS3ResumeProtocolGuid, | ||||||
|  |            NULL | ||||||
|  |            ); | ||||||
|  |   ASSERT_EFI_ERROR (Status); | ||||||
|  |  | ||||||
|  |   return Status; | ||||||
|  | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
|   Determine if two buffers overlap in memory. |   Determine if two buffers overlap in memory. | ||||||
|  |  | ||||||
|   | |||||||
| @@ -32,6 +32,7 @@ | |||||||
| #include <Protocol/SmmExitBootServices.h> | #include <Protocol/SmmExitBootServices.h> | ||||||
| #include <Protocol/SmmLegacyBoot.h> | #include <Protocol/SmmLegacyBoot.h> | ||||||
| #include <Protocol/SmmReadyToBoot.h> | #include <Protocol/SmmReadyToBoot.h> | ||||||
|  | #include <Protocol/SmmEndOfS3Resume.h> | ||||||
|  |  | ||||||
| #include <Guid/Apriori.h> | #include <Guid/Apriori.h> | ||||||
| #include <Guid/EventGroup.h> | #include <Guid/EventGroup.h> | ||||||
| @@ -801,6 +802,29 @@ SmmReadyToBootHandler ( | |||||||
|   IN OUT UINTN                    *CommBufferSize  OPTIONAL |   IN OUT UINTN                    *CommBufferSize  OPTIONAL | ||||||
|   ); |   ); | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |   Software SMI handler that is called when the EndOfS3Resume event is trigged. | ||||||
|  |   This function installs the SMM EndOfS3Resume Protocol so SMM Drivers are informed that | ||||||
|  |   S3 resume has finished. | ||||||
|  |  | ||||||
|  |   @param  DispatchHandle  The unique handle assigned to this handler by SmiHandlerRegister(). | ||||||
|  |   @param  Context         Points to an optional handler context which was specified when the handler was registered. | ||||||
|  |   @param  CommBuffer      A pointer to a collection of data in memory that will | ||||||
|  |                           be conveyed from a non-SMM environment into an SMM environment. | ||||||
|  |   @param  CommBufferSize  The size of the CommBuffer. | ||||||
|  |  | ||||||
|  |   @return Status Code | ||||||
|  |  | ||||||
|  | **/ | ||||||
|  | EFI_STATUS | ||||||
|  | EFIAPI | ||||||
|  | SmmEndOfS3ResumeHandler ( | ||||||
|  |   IN     EFI_HANDLE  DispatchHandle, | ||||||
|  |   IN     CONST VOID  *Context,        OPTIONAL | ||||||
|  |   IN OUT VOID        *CommBuffer,     OPTIONAL | ||||||
|  |   IN OUT UINTN       *CommBufferSize  OPTIONAL | ||||||
|  |   ); | ||||||
|  |  | ||||||
| /** | /** | ||||||
|   Place holder function until all the SMM System Table Service are available. |   Place holder function until all the SMM System Table Service are available. | ||||||
|  |  | ||||||
|   | |||||||
| @@ -79,6 +79,7 @@ | |||||||
|   gEdkiiSmmExitBootServicesProtocolGuid         ## SOMETIMES_PRODUCES |   gEdkiiSmmExitBootServicesProtocolGuid         ## SOMETIMES_PRODUCES | ||||||
|   gEdkiiSmmLegacyBootProtocolGuid               ## SOMETIMES_PRODUCES |   gEdkiiSmmLegacyBootProtocolGuid               ## SOMETIMES_PRODUCES | ||||||
|   gEdkiiSmmReadyToBootProtocolGuid              ## PRODUCES |   gEdkiiSmmReadyToBootProtocolGuid              ## PRODUCES | ||||||
|  |   gEdkiiSmmEndOfS3ResumeProtocolGuid            ## SOMETIMES_PRODUCES | ||||||
|  |  | ||||||
|   gEfiSmmSwDispatch2ProtocolGuid                ## SOMETIMES_CONSUMES |   gEfiSmmSwDispatch2ProtocolGuid                ## SOMETIMES_CONSUMES | ||||||
|   gEfiSmmSxDispatch2ProtocolGuid                ## SOMETIMES_CONSUMES |   gEfiSmmSxDispatch2ProtocolGuid                ## SOMETIMES_CONSUMES | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user