UefiCpuPkg/PiSmmCpuDxeSmm: implement non-stop mode for SMM
Since SMM profile feature has already implemented non-stop mode if #PF occurred, this patch just makes use of the existing implementation to accommodate heap guard and NULL pointer detection feature. Cc: Eric Dong <eric.dong@intel.com> Cc: Laszlo Ersek <lersek@redhat.com> Cc: Ruiyu Ni <ruiyu.ni@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Jian J Wang <jian.j.wang@intel.com> Reviewed-by: Eric Dong <eric.dong@intel.com> Acked-by: Laszlo Ersek <lersek@redhat.com>
This commit is contained in:
@@ -38,7 +38,9 @@ SmmInitPageTable (
|
||||
|
||||
mPhysicalAddressBits = 32;
|
||||
|
||||
if (FeaturePcdGet (PcdCpuSmmProfileEnable)) {
|
||||
if (FeaturePcdGet (PcdCpuSmmProfileEnable) ||
|
||||
HEAP_GUARD_NONSTOP_MODE ||
|
||||
NULL_DETECTION_NONSTOP_MODE) {
|
||||
//
|
||||
// Set own Page Fault entry instead of the default one, because SMM Profile
|
||||
// feature depends on IRET instruction to do Single Step
|
||||
@@ -129,6 +131,11 @@ SmiPFHandler (
|
||||
DumpModuleInfoByIp ((UINTN)SystemContext.SystemContextIa32->Eip);
|
||||
);
|
||||
}
|
||||
|
||||
if (HEAP_GUARD_NONSTOP_MODE) {
|
||||
GuardPagePFHandler (SystemContext.SystemContextIa32->ExceptionData);
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
CpuDeadLoop ();
|
||||
}
|
||||
@@ -146,6 +153,26 @@ SmiPFHandler (
|
||||
);
|
||||
CpuDeadLoop ();
|
||||
}
|
||||
|
||||
//
|
||||
// If NULL pointer was just accessed
|
||||
//
|
||||
if ((PcdGet8 (PcdNullPointerDetectionPropertyMask) & BIT1) != 0 &&
|
||||
(PFAddress < EFI_PAGE_SIZE)) {
|
||||
DumpCpuContext (InterruptType, SystemContext);
|
||||
DEBUG ((DEBUG_ERROR, "!!! NULL pointer access !!!\n"));
|
||||
DEBUG_CODE (
|
||||
DumpModuleInfoByIp ((UINTN)SystemContext.SystemContextIa32->Eip);
|
||||
);
|
||||
|
||||
if (NULL_DETECTION_NONSTOP_MODE) {
|
||||
GuardPagePFHandler (SystemContext.SystemContextIa32->ExceptionData);
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
CpuDeadLoop ();
|
||||
}
|
||||
|
||||
if (IsSmmCommBufferForbiddenAddress (PFAddress)) {
|
||||
DumpCpuContext (InterruptType, SystemContext);
|
||||
DEBUG ((DEBUG_ERROR, "Access SMM communication forbidden address (0x%x)!\n", PFAddress));
|
||||
@@ -156,19 +183,6 @@ SmiPFHandler (
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// If NULL pointer was just accessed
|
||||
//
|
||||
if ((PcdGet8 (PcdNullPointerDetectionPropertyMask) & BIT1) != 0 &&
|
||||
(PFAddress < EFI_PAGE_SIZE)) {
|
||||
DumpCpuContext (InterruptType, SystemContext);
|
||||
DEBUG ((DEBUG_ERROR, "!!! NULL pointer access !!!\n"));
|
||||
DEBUG_CODE (
|
||||
DumpModuleInfoByIp ((UINTN)SystemContext.SystemContextIa32->Eip);
|
||||
);
|
||||
CpuDeadLoop ();
|
||||
}
|
||||
|
||||
if (FeaturePcdGet (PcdCpuSmmProfileEnable)) {
|
||||
SmmProfilePFHandler (
|
||||
SystemContext.SystemContextIa32->Eip,
|
||||
@@ -179,6 +193,7 @@ SmiPFHandler (
|
||||
SmiDefaultPFHandler ();
|
||||
}
|
||||
|
||||
Exit:
|
||||
ReleaseSpinLock (mPFLock);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user