UefiCpuPkg/PiSmmCpuDxeSmm: Add SmmMemoryAttribute protocol
Heap guard makes use of paging mechanism to implement its functionality. But there's no protocol or library available to change page attribute in SMM mode. A new protocol gEdkiiSmmMemoryAttributeProtocolGuid is introduced to make it happen. This protocol provide three interfaces struct _EDKII_SMM_MEMORY_ATTRIBUTE_PROTOCOL { EDKII_SMM_GET_MEMORY_ATTRIBUTES GetMemoryAttributes; EDKII_SMM_SET_MEMORY_ATTRIBUTES SetMemoryAttributes; EDKII_SMM_CLEAR_MEMORY_ATTRIBUTES ClearMemoryAttributes; }; Since heap guard feature need to update page attributes. The page table should not set to be read-only if heap guard feature is enabled for SMM mode. Otherwise this feature cannot work. Cc: Eric Dong <eric.dong@intel.com> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Laszlo Ersek <lersek@redhat.com> Cc: Ruiyu Ni <ruiyu.ni@intel.com> Suggested-by: Ayellet Wolman <ayellet.wolman@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Jian J Wang <jian.j.wang@intel.com> Reviewed-by: Jiewen Yao <jiewen.yao@intel.com> Regression-tested-by: Laszlo Ersek <lersek@redhat.com>
This commit is contained in:
@@ -76,6 +76,15 @@ EFI_SMM_CPU_PROTOCOL mSmmCpu = {
|
||||
SmmWriteSaveState
|
||||
};
|
||||
|
||||
///
|
||||
/// SMM Memory Attribute Protocol instance
|
||||
///
|
||||
EDKII_SMM_MEMORY_ATTRIBUTE_PROTOCOL mSmmMemoryAttribute = {
|
||||
EdkiiSmmGetMemoryAttributes,
|
||||
EdkiiSmmSetMemoryAttributes,
|
||||
EdkiiSmmClearMemoryAttributes
|
||||
};
|
||||
|
||||
EFI_CPU_INTERRUPT_HANDLER mExternalVectorTable[EXCEPTION_VECTOR_NUMBER];
|
||||
|
||||
//
|
||||
@@ -893,6 +902,17 @@ PiCpuSmmEntry (
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
//
|
||||
// Install the SMM Memory Attribute Protocol into SMM protocol database
|
||||
//
|
||||
Status = gSmst->SmmInstallProtocolInterface (
|
||||
&mSmmCpuHandle,
|
||||
&gEdkiiSmmMemoryAttributeProtocolGuid,
|
||||
EFI_NATIVE_INTERFACE,
|
||||
&mSmmMemoryAttribute
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
//
|
||||
// Expose address of CPU Hot Plug Data structure if CPU hot plug is supported.
|
||||
//
|
||||
|
Reference in New Issue
Block a user