MdeModulePkg PiSmmCore: Use SxDispatch in SmmEndOfDxeHandler()

As some implementation of SMM Child Dispatcher (including SxDispatch)
may deny the handler registration after SmmReadyToLock, using
SxDispatch in SmmReadyToBootHandler() will be too late.

This patch updates code to use SxDispatch in SmmEndOfDxeHandler()
instead of SmmReadyToBootHandler().

Cc: Jiewen Yao <jiewen.yao@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Star Zeng <star.zeng@intel.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
This commit is contained in:
Star Zeng 2017-12-14 16:20:32 +08:00
parent 27dc016c3f
commit b36acb21c0
1 changed files with 33 additions and 32 deletions

View File

@ -296,9 +296,6 @@ SmmReadyToBootHandler (
{
EFI_STATUS Status;
EFI_HANDLE SmmHandle;
EFI_SMM_SX_DISPATCH2_PROTOCOL *SxDispatch;
EFI_SMM_SX_REGISTER_CONTEXT EntryRegisterContext;
EFI_HANDLE S3EntryHandle;
//
// Install SMM Ready To Boot protocol.
@ -313,31 +310,7 @@ SmmReadyToBootHandler (
SmiHandlerUnRegister (DispatchHandle);
//
// Locate SmmSxDispatch2 protocol.
//
Status = SmmLocateProtocol (
&gEfiSmmSxDispatch2ProtocolGuid,
NULL,
(VOID **)&SxDispatch
);
if (!EFI_ERROR (Status) && (SxDispatch != NULL)) {
//
// Register a S3 entry callback function to
// determine if it will be during S3 resume.
//
EntryRegisterContext.Type = SxS3;
EntryRegisterContext.Phase = SxEntry;
Status = SxDispatch->Register (
SxDispatch,
SmmS3EntryCallBack,
&EntryRegisterContext,
&S3EntryHandle
);
ASSERT_EFI_ERROR (Status);
}
return EFI_SUCCESS;
return Status;
}
/**
@ -452,10 +425,14 @@ SmmEndOfDxeHandler (
IN OUT UINTN *CommBufferSize OPTIONAL
)
{
EFI_STATUS Status;
EFI_HANDLE SmmHandle;
EFI_STATUS Status;
EFI_HANDLE SmmHandle;
EFI_SMM_SX_DISPATCH2_PROTOCOL *SxDispatch;
EFI_SMM_SX_REGISTER_CONTEXT EntryRegisterContext;
EFI_HANDLE S3EntryHandle;
DEBUG ((EFI_D_INFO, "SmmEndOfDxeHandler\n"));
//
// Install SMM EndOfDxe protocol
//
@ -466,7 +443,32 @@ SmmEndOfDxeHandler (
EFI_NATIVE_INTERFACE,
NULL
);
return Status;
//
// Locate SmmSxDispatch2 protocol.
//
Status = SmmLocateProtocol (
&gEfiSmmSxDispatch2ProtocolGuid,
NULL,
(VOID **)&SxDispatch
);
if (!EFI_ERROR (Status) && (SxDispatch != NULL)) {
//
// Register a S3 entry callback function to
// determine if it will be during S3 resume.
//
EntryRegisterContext.Type = SxS3;
EntryRegisterContext.Phase = SxEntry;
Status = SxDispatch->Register (
SxDispatch,
SmmS3EntryCallBack,
&EntryRegisterContext,
&S3EntryHandle
);
ASSERT_EFI_ERROR (Status);
}
return EFI_SUCCESS;
}
/**
@ -526,7 +528,6 @@ SmmEndOfS3ResumeHandler (
ASSERT_EFI_ERROR (Status);
mDuringS3Resume = FALSE;
return Status;
}