UefiCpuPkg PiSmmCpuDxeSmm: SMM profile and static paging mutual exclusion

SMM profile and static paging could not be enabled at the same time,
this patch is to add check and comments to make sure it.

Similar comments are also added for the case of static paging and
heap guard for SMM.

Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Eric Dong <eric.dong@intel.com>
Cc: Ruiyu Ni <ruiyu.ni@intel.com>
Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Star Zeng <star.zeng@intel.com>
Reviewed-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
This commit is contained in:
Star Zeng 2017-12-07 17:00:48 +08:00
parent 5d0e003c8c
commit 1015fb3c1b
4 changed files with 35 additions and 9 deletions

View File

@ -199,12 +199,21 @@ SetPageTableAttributes (
BOOLEAN PageTableSplitted; BOOLEAN PageTableSplitted;
// //
// Don't mark page table as read-only if heap guard is enabled. // Don't mark page table to read-only if heap guard is enabled.
// //
// BIT2: SMM page guard enabled // BIT2: SMM page guard enabled
// BIT3: SMM pool guard enabled // BIT3: SMM pool guard enabled
// //
if ((PcdGet8 (PcdHeapGuardPropertyMask) & (BIT3 | BIT2)) != 0) { if ((PcdGet8 (PcdHeapGuardPropertyMask) & (BIT3 | BIT2)) != 0) {
DEBUG ((DEBUG_INFO, "Don't mark page table to read-only as heap guard is enabled\n"));
return ;
}
//
// Don't mark page table to read-only if SMM profile is enabled.
//
if (FeaturePcdGet (PcdCpuSmmProfileEnable)) {
DEBUG ((DEBUG_INFO, "Don't mark page table to read-only as SMM profile is enabled\n"));
return ; return ;
} }

View File

@ -919,17 +919,24 @@ SetPageTableAttributes (
// //
// Don't do this if // Don't do this if
// - no static page table; or // - no static page table; or
// - SMM heap guard feature enabled // - SMM heap guard feature enabled; or
// BIT2: SMM page guard enabled // BIT2: SMM page guard enabled
// BIT3: SMM pool guard enabled // BIT3: SMM pool guard enabled
// - SMM profile feature enabled
// //
if (!mCpuSmmStaticPageTable || if (!mCpuSmmStaticPageTable ||
(PcdGet8 (PcdHeapGuardPropertyMask) & (BIT3 | BIT2)) != 0) { ((PcdGet8 (PcdHeapGuardPropertyMask) & (BIT3 | BIT2)) != 0) ||
FeaturePcdGet (PcdCpuSmmProfileEnable)) {
// //
// Static paging and heap guard should not be enabled at the same time. // Static paging and heap guard could not be enabled at the same time.
// //
ASSERT (!(mCpuSmmStaticPageTable && ASSERT (!(mCpuSmmStaticPageTable &&
(PcdGet8 (PcdHeapGuardPropertyMask) & (BIT3 | BIT2)) != 0)); (PcdGet8 (PcdHeapGuardPropertyMask) & (BIT3 | BIT2)) != 0));
//
// Static paging and SMM profile could not be enabled at the same time.
//
ASSERT (!(mCpuSmmStaticPageTable && FeaturePcdGet (PcdCpuSmmProfileEnable)));
return ; return ;
} }

View File

@ -84,6 +84,7 @@
[PcdsFeatureFlag] [PcdsFeatureFlag]
## Indicates if SMM Profile will be enabled. ## Indicates if SMM Profile will be enabled.
# If enabled, instruction executions in and data accesses to memory outside of SMRAM will be logged. # If enabled, instruction executions in and data accesses to memory outside of SMRAM will be logged.
# It could not be enabled at the same time with SMM static page table feature (PcdCpuSmmStaticPageTable).
# This PCD is only for validation purpose. It should be set to false in production.<BR><BR> # This PCD is only for validation purpose. It should be set to false in production.<BR><BR>
# TRUE - SMM Profile will be enabled.<BR> # TRUE - SMM Profile will be enabled.<BR>
# FALSE - SMM Profile will be disabled.<BR> # FALSE - SMM Profile will be disabled.<BR>
@ -225,8 +226,11 @@
gUefiCpuPkgTokenSpaceGuid.PcdCpuApTargetCstate|0|UINT8|0x00000007 gUefiCpuPkgTokenSpaceGuid.PcdCpuApTargetCstate|0|UINT8|0x00000007
## Indicates if SMM uses static page table. ## Indicates if SMM uses static page table.
# If enabled, SMM will not use on-demand paging. SMM will build static page table for all memory.<BR><BR> # If enabled, SMM will not use on-demand paging. SMM will build static page table for all memory.
# This flag only impacts X64 build, because SMM alway builds static page table for IA32. # This flag only impacts X64 build, because SMM always builds static page table for IA32.
# It could not be enabled at the same time with SMM profile feature (PcdCpuSmmProfileEnable).
# It could not be enabled also at the same time with heap guard feature for SMM
# (PcdHeapGuardPropertyMask in MdeModulePkg).<BR><BR>
# TRUE - SMM uses static page table for all memory.<BR> # TRUE - SMM uses static page table for all memory.<BR>
# FALSE - SMM uses static page table for below 4G memory and use on-demand paging for above 4G memory.<BR> # FALSE - SMM uses static page table for below 4G memory and use on-demand paging for above 4G memory.<BR>
# @Prompt Use static page table for all memory in SMM. # @Prompt Use static page table for all memory in SMM.

View File

@ -53,7 +53,10 @@
#string STR_gUefiCpuPkgTokenSpaceGuid_PcdCpuSmmProfileEnable_PROMPT #language en-US "Enable SMM Profile" #string STR_gUefiCpuPkgTokenSpaceGuid_PcdCpuSmmProfileEnable_PROMPT #language en-US "Enable SMM Profile"
#string STR_gUefiCpuPkgTokenSpaceGuid_PcdCpuSmmProfileEnable_HELP #language en-US "Indicates if SMM Profile will be enabled. If enabled, instruction executions in and data accesses to memory outside of SMRAM will be logged. This PCD is only for validation purpose. It should be set to false in production.<BR><BR>\n" #string STR_gUefiCpuPkgTokenSpaceGuid_PcdCpuSmmProfileEnable_HELP #language en-US "Indicates if SMM Profile will be enabled.\n"
"If enabled, instruction executions in and data accesses to memory outside of SMRAM will be logged.\n"
"It could not be enabled at the same time with SMM static page table feature (PcdCpuSmmStaticPageTable).\n"
"This PCD is only for validation purpose. It should be set to false in production.<BR><BR>\n"
"TRUE - SMM Profile will be enabled.<BR>\n" "TRUE - SMM Profile will be enabled.<BR>\n"
"FALSE - SMM Profile will be disabled.<BR>" "FALSE - SMM Profile will be disabled.<BR>"
@ -150,8 +153,11 @@
#string STR_gUefiCpuPkgTokenSpaceGuid_PcdCpuSmmStaticPageTable_PROMPT #language en-US "Use static page table for all memory in SMM." #string STR_gUefiCpuPkgTokenSpaceGuid_PcdCpuSmmStaticPageTable_PROMPT #language en-US "Use static page table for all memory in SMM."
#string STR_gUefiCpuPkgTokenSpaceGuid_PcdCpuSmmStaticPageTable_HELP #language en-US "Indicates if SMM uses static page table.\n" #string STR_gUefiCpuPkgTokenSpaceGuid_PcdCpuSmmStaticPageTable_HELP #language en-US "Indicates if SMM uses static page table.\n"
"If enabled, SMM will not use on-demand paging. SMM will build static page table for all memory.<BR><BR>\n" "If enabled, SMM will not use on-demand paging. SMM will build static page table for all memory.\n"
"This flag only impacts X64 build, because SMM alway builds static page table for IA32.\n" "This flag only impacts X64 build, because SMM always builds static page table for IA32.\n"
"It could not be enabled at the same time with SMM profile feature (PcdCpuSmmProfileEnable).\n"
"It could not be enabled also at the same time with heap guard feature for SMM\n"
"(PcdHeapGuardPropertyMask in MdeModulePkg).<BR><BR>\n"
"TRUE - SMM uses static page table for all memory.<BR>\n" "TRUE - SMM uses static page table for all memory.<BR>\n"
"FALSE - SMM uses static page table for below 4G memory and use on-demand paging for above 4G memory.<BR>" "FALSE - SMM uses static page table for below 4G memory and use on-demand paging for above 4G memory.<BR>"