UefiCpuPkg/PiSmmCpuDxeSmm: Add IsInSmmRanges() to check SMM range

Internal function IsInSmmRanges() is added t check SMM range by saved SMM ranges
beside by mCpuHotPlugData.SmrrBase/mCpuHotPlugData.SmrrSiz.

Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Michael Kinney <michael.d.kinney@intel.com>
Cc: Feng Tian <feng.tian@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jeff Fan <jeff.fan@intel.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
This commit is contained in:
Jeff Fan 2017-03-28 13:51:52 +08:00
parent 7ed6f78145
commit 97f1061e8b
1 changed files with 31 additions and 5 deletions

View File

@ -1,7 +1,7 @@
/** @file
Enable SMM profile.
Copyright (c) 2012 - 2016, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2012 - 2017, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
This program and the accompanying materials
@ -246,6 +246,33 @@ DebugExceptionHandler (
ClearTrapFlag (SystemContext);
}
/**
Check if the input address is in SMM ranges.
@param[in] Address The input address.
@retval TRUE The input address is in SMM.
@retval FALSE The input address is not in SMM.
**/
BOOLEAN
IsInSmmRanges (
IN EFI_PHYSICAL_ADDRESS Address
)
{
UINTN Index;
if ((Address < mCpuHotPlugData.SmrrBase) || (Address >= mCpuHotPlugData.SmrrBase + mCpuHotPlugData.SmrrSize)) {
return TRUE;
}
for (Index = 0; Index < mSmmCpuSmramRangeCount; Index++) {
if (Address >= mSmmCpuSmramRanges[Index].CpuStart &&
Address < mSmmCpuSmramRanges[Index].CpuStart + mSmmCpuSmramRanges[Index].PhysicalSize) {
return TRUE;
}
}
return FALSE;
}
/**
Check if the memory address will be mapped by 4KB-page.
@ -261,7 +288,6 @@ IsAddressValid (
{
UINTN Index;
*Nx = FALSE;
if (FeaturePcdGet (PcdCpuSmmProfileEnable)) {
//
// Check configuration
@ -276,9 +302,9 @@ IsAddressValid (
return FALSE;
} else {
if ((Address < mCpuHotPlugData.SmrrBase) ||
(Address >= mCpuHotPlugData.SmrrBase + mCpuHotPlugData.SmrrSize)) {
*Nx = TRUE;
*Nx = TRUE;
if (IsInSmmRanges (Address)) {
*Nx = FALSE;
}
return TRUE;
}