mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-06 13:24:23 +02:00
Starting from certain version of Visual Studio C compiler (I don’t have the exact version. I am using VS2019), CpuDeadLoop is optimized quite well by compiler. The compiler does not generate instructions that jump out of the loop when the "Index" is non-zero. It becomes harder/impossible for developers to break out of the dead-loop in debugger. The new version of CpuDeadLoop() compares a volatile global to a volatile local. This forces 2 reads and a comparison on every loop iteration. The local variable can be set to 1 to exit the loop without modifying the global variable. Using VS2019 with max opt enabled, The dead-loop can be exit by setting Index to 1 in a debugger. Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
35 lines
768 B
C
35 lines
768 B
C
/** @file
|
|
Base Library CPU Functions for all architectures.
|
|
|
|
Copyright (c) 2006 - 2024, Intel Corporation. All rights reserved.<BR>
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
|
**/
|
|
|
|
#include <Base.h>
|
|
#include <Library/BaseLib.h>
|
|
|
|
static volatile UINTN mDeadLoopComparator = 0;
|
|
|
|
/**
|
|
Executes an infinite loop.
|
|
|
|
Forces the CPU to execute an infinite loop. A debugger may be used to skip
|
|
past the loop and the code that follows the loop must execute properly. This
|
|
implies that the infinite loop must not cause the code that follow it to be
|
|
optimized away.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
CpuDeadLoop (
|
|
VOID
|
|
)
|
|
{
|
|
volatile UINTN Index;
|
|
|
|
for (Index = mDeadLoopComparator; Index == mDeadLoopComparator;) {
|
|
CpuPause ();
|
|
}
|
|
}
|