mirror of https://github.com/acidanthera/audk.git
Fixed a bug in the HardwareInterrupt handler that would blow the stack if you reenable interrupts in the TimerHandler. It should be noted this happens as the TimerHandler raises and restores TPL for the timer tick used by the DXE Core. There was some work around code in the CPU driver to prevent interrupts from being enabled while handling exceptions. This has been removed.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9701 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
2127579be1
commit
d213712d4f
|
@ -14,7 +14,6 @@
|
|||
|
||||
#include "CpuDxe.h"
|
||||
|
||||
BOOLEAN gExceptionContext = FALSE;
|
||||
BOOLEAN mInterruptState = FALSE;
|
||||
|
||||
EFI_STATUS
|
||||
|
@ -49,9 +48,7 @@ CpuEnableInterrupt (
|
|||
IN EFI_CPU_ARCH_PROTOCOL *This
|
||||
)
|
||||
{
|
||||
if (!gExceptionContext) {
|
||||
ArmEnableInterrupts ();
|
||||
}
|
||||
ArmEnableInterrupts ();
|
||||
|
||||
mInterruptState = TRUE;
|
||||
return EFI_SUCCESS;
|
||||
|
@ -64,9 +61,7 @@ CpuDisableInterrupt (
|
|||
IN EFI_CPU_ARCH_PROTOCOL *This
|
||||
)
|
||||
{
|
||||
if (!gExceptionContext) {
|
||||
ArmDisableInterrupts ();
|
||||
}
|
||||
ArmDisableInterrupts ();
|
||||
|
||||
mInterruptState = FALSE;
|
||||
return EFI_SUCCESS;
|
||||
|
|
|
@ -15,8 +15,6 @@
|
|||
#include "CpuDxe.h"
|
||||
#include <Library/CacheMaintenanceLib.h>
|
||||
|
||||
extern BOOLEAN gExceptionContext;
|
||||
|
||||
VOID
|
||||
ExceptionHandlersStart (
|
||||
VOID
|
||||
|
@ -142,8 +140,7 @@ CommonCExceptionHandler (
|
|||
{
|
||||
BOOLEAN Dispatched = FALSE;
|
||||
|
||||
gExceptionContext = TRUE;
|
||||
|
||||
|
||||
if (ExceptionType <= MAX_ARM_EXCEPTION) {
|
||||
if (gDebuggerExceptionHandlers[ExceptionType]) {
|
||||
//
|
||||
|
@ -162,8 +159,6 @@ CommonCExceptionHandler (
|
|||
ASSERT (FALSE);
|
||||
}
|
||||
|
||||
gExceptionContext = FALSE;
|
||||
|
||||
if (Dispatched) {
|
||||
//
|
||||
// We did work so this was an expected ExceptionType
|
||||
|
|
|
@ -234,12 +234,16 @@ IrqInterruptHandler (
|
|||
|
||||
Vector = MmioRead32(INTCPS_SIR_IRQ) & INTCPS_SIR_IRQ_MASK;
|
||||
|
||||
// Needed to prevent infinite nesting if Time Driver lowers TPL
|
||||
MmioWrite32(INTCPS_CONTROL, INTCPS_CONTROL_NEWIRQAGR);
|
||||
|
||||
InterruptHandler = gRegisteredInterruptHandlers[Vector];
|
||||
if (InterruptHandler != NULL) {
|
||||
// Call the registered interrupt handler.
|
||||
InterruptHandler(Vector, SystemContext);
|
||||
}
|
||||
|
||||
// Needed to clear after running the handler
|
||||
MmioWrite32(INTCPS_CONTROL, INTCPS_CONTROL_NEWIRQAGR);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue