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:
@@ -300,7 +300,9 @@ SmmInitPageTable (
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
@@ -846,6 +848,11 @@ SmiPFHandler (
|
||||
DumpModuleInfoByIp ((UINTN)SystemContext.SystemContextX64->Rip);
|
||||
);
|
||||
}
|
||||
|
||||
if (HEAP_GUARD_NONSTOP_MODE) {
|
||||
GuardPagePFHandler (SystemContext.SystemContextX64->ExceptionData);
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
CpuDeadLoop ();
|
||||
}
|
||||
@@ -863,6 +870,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.SystemContextX64->Rip);
|
||||
);
|
||||
|
||||
if (NULL_DETECTION_NONSTOP_MODE) {
|
||||
GuardPagePFHandler (SystemContext.SystemContextX64->ExceptionData);
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
CpuDeadLoop ();
|
||||
}
|
||||
|
||||
if (IsSmmCommBufferForbiddenAddress (PFAddress)) {
|
||||
DumpCpuContext (InterruptType, SystemContext);
|
||||
DEBUG ((DEBUG_ERROR, "Access SMM communication forbidden address (0x%lx)!\n", PFAddress));
|
||||
@@ -873,19 +900,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.SystemContextX64->Rip);
|
||||
);
|
||||
CpuDeadLoop ();
|
||||
}
|
||||
|
||||
if (FeaturePcdGet (PcdCpuSmmProfileEnable)) {
|
||||
SmmProfilePFHandler (
|
||||
SystemContext.SystemContextX64->Rip,
|
||||
@@ -895,6 +909,7 @@ SmiPFHandler (
|
||||
SmiDefaultPFHandler ();
|
||||
}
|
||||
|
||||
Exit:
|
||||
ReleaseSpinLock (mPFLock);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user