MdeModulePkg/DxeCore: Install UEFI mem attrib table at EndOfDxe.

So that the SMM can consume it to set page protection for
the UEFI runtime page with EFI_MEMORY_RO attribute.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Jiewen Yao <jiewen.yao@intel.com>
Reviewed-by: Star Zeng <star.zeng@intel.com>
This commit is contained in:
Jiewen Yao 2017-11-22 22:05:07 +08:00
parent ac6613db46
commit b2305dd277

View File

@ -240,6 +240,23 @@ InstallMemoryAttributesTableOnReadyToBoot (
mMemoryAttributesTableReadyToBoot = TRUE; mMemoryAttributesTableReadyToBoot = TRUE;
} }
/**
Install initial MemoryAttributesTable on EndOfDxe.
Then SMM can consume this information.
@param[in] Event The Event this notify function registered to.
@param[in] Context Pointer to the context data registered to the Event.
**/
VOID
EFIAPI
InstallMemoryAttributesTableOnEndOfDxe (
IN EFI_EVENT Event,
IN VOID *Context
)
{
InstallMemoryAttributesTable ();
}
/** /**
Initialize MemoryAttrubutesTable support. Initialize MemoryAttrubutesTable support.
**/ **/
@ -251,18 +268,35 @@ CoreInitializeMemoryAttributesTable (
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_EVENT ReadyToBootEvent; EFI_EVENT ReadyToBootEvent;
EFI_EVENT EndOfDxeEvent;
// //
// Construct the table at ReadyToBoot. // Construct the table at ReadyToBoot.
// //
Status = CoreCreateEventInternal ( Status = CoreCreateEventInternal (
EVT_NOTIFY_SIGNAL, EVT_NOTIFY_SIGNAL,
TPL_CALLBACK - 1, TPL_CALLBACK,
InstallMemoryAttributesTableOnReadyToBoot, InstallMemoryAttributesTableOnReadyToBoot,
NULL, NULL,
&gEfiEventReadyToBootGuid, &gEfiEventReadyToBootGuid,
&ReadyToBootEvent &ReadyToBootEvent
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
//
// Construct the initial table at EndOfDxe,
// then SMM can consume this information.
// Use TPL_NOTIFY here, as such SMM code (TPL_CALLBACK)
// can run after it.
//
Status = CoreCreateEventInternal (
EVT_NOTIFY_SIGNAL,
TPL_NOTIFY,
InstallMemoryAttributesTableOnEndOfDxe,
NULL,
&gEfiEndOfDxeEventGroupGuid,
&EndOfDxeEvent
);
ASSERT_EFI_ERROR (Status);
return ; return ;
} }