UefiCpuPkg/CpuDxe: implement non-stop mode for uefi
Same as SMM profile feature, a special #PF is used to set page attribute to 'present' and a special #DB handler to reset it back to 'not-present', right after the instruction causing #PF got executed. Since the new #PF handler won't enter into dead-loop, the instruction which caused the #PF will get chance to re-execute with accessible pages. The exception message will still be printed out on debug console so that the developer/QA can find that there's potential heap overflow or null pointer access occurred. 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:
@@ -673,10 +673,6 @@ InitializeMpExceptionStackSwitchHandlers (
|
||||
UINT8 *GdtBuffer;
|
||||
UINT8 *StackTop;
|
||||
|
||||
if (!PcdGetBool (PcdCpuStackGuard)) {
|
||||
return;
|
||||
}
|
||||
|
||||
ExceptionNumber = FixedPcdGetSize (PcdCpuStackSwitchExceptionList);
|
||||
NewStackSize = FixedPcdGet32 (PcdCpuKnownGoodStackSize) * ExceptionNumber;
|
||||
|
||||
@@ -790,6 +786,32 @@ InitializeMpExceptionStackSwitchHandlers (
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Initializes MP exceptions handlers for special features, such as Heap Guard
|
||||
and Stack Guard.
|
||||
**/
|
||||
VOID
|
||||
InitializeMpExceptionHandlers (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
//
|
||||
// Enable non-stop mode for #PF triggered by Heap Guard or NULL Pointer
|
||||
// Detection.
|
||||
//
|
||||
if (HEAP_GUARD_NONSTOP_MODE || NULL_DETECTION_NONSTOP_MODE) {
|
||||
RegisterCpuInterruptHandler (EXCEPT_IA32_DEBUG, DebugExceptionHandler);
|
||||
RegisterCpuInterruptHandler (EXCEPT_IA32_PAGE_FAULT, PageFaultExceptionHandler);
|
||||
}
|
||||
|
||||
//
|
||||
// Setup stack switch for Stack Guard feature.
|
||||
//
|
||||
if (PcdGetBool (PcdCpuStackGuard)) {
|
||||
InitializeMpExceptionStackSwitchHandlers ();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Initialize Multi-processor support.
|
||||
|
||||
@@ -814,9 +836,9 @@ InitializeMpSupport (
|
||||
DEBUG ((DEBUG_INFO, "Detect CPU count: %d\n", mNumberOfProcessors));
|
||||
|
||||
//
|
||||
// Initialize exception stack switch handlers for each logic processor.
|
||||
// Initialize special exception handlers for each logic processor.
|
||||
//
|
||||
InitializeMpExceptionStackSwitchHandlers ();
|
||||
InitializeMpExceptionHandlers ();
|
||||
|
||||
//
|
||||
// Update CPU healthy information from Guided HOB
|
||||
|
Reference in New Issue
Block a user