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:
@@ -25,6 +25,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#include <Protocol/SmmAccess2.h>
|
||||
#include <Protocol/SmmReadyToLock.h>
|
||||
#include <Protocol/SmmCpuService.h>
|
||||
#include <Protocol/SmmMemoryAttribute.h>
|
||||
|
||||
#include <Guid/AcpiS3Context.h>
|
||||
#include <Guid/PiSmmMemoryAttributesTable.h>
|
||||
@@ -1068,4 +1069,101 @@ TransferApToSafeState (
|
||||
IN UINTN NumberToFinishAddress
|
||||
);
|
||||
|
||||
/**
|
||||
This function set given attributes of the memory region specified by
|
||||
BaseAddress and Length.
|
||||
|
||||
@param This The EDKII_SMM_MEMORY_ATTRIBUTE_PROTOCOL instance.
|
||||
@param BaseAddress The physical address that is the start address of
|
||||
a memory region.
|
||||
@param Length The size in bytes of the memory region.
|
||||
@param Attributes The bit mask of attributes to set for the memory
|
||||
region.
|
||||
|
||||
@retval EFI_SUCCESS The attributes were set for the memory region.
|
||||
@retval EFI_INVALID_PARAMETER Length is zero.
|
||||
Attributes specified an illegal combination of
|
||||
attributes that cannot be set together.
|
||||
@retval EFI_UNSUPPORTED The processor does not support one or more
|
||||
bytes of the memory resource range specified
|
||||
by BaseAddress and Length.
|
||||
The bit mask of attributes is not support for
|
||||
the memory resource range specified by
|
||||
BaseAddress and Length.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EdkiiSmmSetMemoryAttributes (
|
||||
IN EDKII_SMM_MEMORY_ATTRIBUTE_PROTOCOL *This,
|
||||
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
||||
IN UINT64 Length,
|
||||
IN UINT64 Attributes
|
||||
);
|
||||
|
||||
/**
|
||||
This function clears given attributes of the memory region specified by
|
||||
BaseAddress and Length.
|
||||
|
||||
@param This The EDKII_SMM_MEMORY_ATTRIBUTE_PROTOCOL instance.
|
||||
@param BaseAddress The physical address that is the start address of
|
||||
a memory region.
|
||||
@param Length The size in bytes of the memory region.
|
||||
@param Attributes The bit mask of attributes to set for the memory
|
||||
region.
|
||||
|
||||
@retval EFI_SUCCESS The attributes were set for the memory region.
|
||||
@retval EFI_INVALID_PARAMETER Length is zero.
|
||||
Attributes specified an illegal combination of
|
||||
attributes that cannot be set together.
|
||||
@retval EFI_UNSUPPORTED The processor does not support one or more
|
||||
bytes of the memory resource range specified
|
||||
by BaseAddress and Length.
|
||||
The bit mask of attributes is not support for
|
||||
the memory resource range specified by
|
||||
BaseAddress and Length.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EdkiiSmmClearMemoryAttributes (
|
||||
IN EDKII_SMM_MEMORY_ATTRIBUTE_PROTOCOL *This,
|
||||
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
||||
IN UINT64 Length,
|
||||
IN UINT64 Attributes
|
||||
);
|
||||
|
||||
/**
|
||||
This function retrieve the attributes of the memory region specified by
|
||||
BaseAddress and Length. If different attributes are got from different part
|
||||
of the memory region, EFI_NO_MAPPING will be returned.
|
||||
|
||||
@param This The EDKII_SMM_MEMORY_ATTRIBUTE_PROTOCOL instance.
|
||||
@param BaseAddress The physical address that is the start address of
|
||||
a memory region.
|
||||
@param Length The size in bytes of the memory region.
|
||||
@param Attributes Pointer to attributes returned.
|
||||
|
||||
@retval EFI_SUCCESS The attributes got for the memory region.
|
||||
@retval EFI_INVALID_PARAMETER Length is zero.
|
||||
Attributes is NULL.
|
||||
@retval EFI_NO_MAPPING Attributes are not consistent cross the memory
|
||||
region.
|
||||
@retval EFI_UNSUPPORTED The processor does not support one or more
|
||||
bytes of the memory resource range specified
|
||||
by BaseAddress and Length.
|
||||
The bit mask of attributes is not support for
|
||||
the memory resource range specified by
|
||||
BaseAddress and Length.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EdkiiSmmGetMemoryAttributes (
|
||||
IN EDKII_SMM_MEMORY_ATTRIBUTE_PROTOCOL *This,
|
||||
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
||||
IN UINT64 Length,
|
||||
IN UINT64 *Attributes
|
||||
);
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user