\r
#include "CpuDxe.h"\r
\r
-BOOLEAN gExceptionContext = FALSE;\r
BOOLEAN mInterruptState = FALSE;\r
\r
EFI_STATUS\r
IN EFI_CPU_ARCH_PROTOCOL *This\r
)\r
{\r
- if (!gExceptionContext) {\r
- ArmEnableInterrupts ();\r
- }\r
+ ArmEnableInterrupts ();\r
\r
mInterruptState = TRUE;\r
return EFI_SUCCESS;\r
IN EFI_CPU_ARCH_PROTOCOL *This\r
)\r
{\r
- if (!gExceptionContext) {\r
- ArmDisableInterrupts ();\r
- }\r
+ ArmDisableInterrupts ();\r
\r
mInterruptState = FALSE;\r
return EFI_SUCCESS;\r
#include "CpuDxe.h" \r
#include <Library/CacheMaintenanceLib.h>\r
\r
-extern BOOLEAN gExceptionContext;\r
-\r
VOID\r
ExceptionHandlersStart (\r
VOID\r
{\r
BOOLEAN Dispatched = FALSE;\r
\r
- gExceptionContext = TRUE; \r
- \r
+ \r
if (ExceptionType <= MAX_ARM_EXCEPTION) {\r
if (gDebuggerExceptionHandlers[ExceptionType]) {\r
//\r
ASSERT (FALSE);\r
}\r
\r
- gExceptionContext = FALSE; \r
-\r
if (Dispatched) {\r
//\r
// We did work so this was an expected ExceptionType\r
\r
Vector = MmioRead32(INTCPS_SIR_IRQ) & INTCPS_SIR_IRQ_MASK;\r
\r
+ // Needed to prevent infinite nesting if Time Driver lowers TPL\r
+ MmioWrite32(INTCPS_CONTROL, INTCPS_CONTROL_NEWIRQAGR);\r
+\r
InterruptHandler = gRegisteredInterruptHandlers[Vector];\r
if (InterruptHandler != NULL) {\r
// Call the registered interrupt handler.\r
InterruptHandler(Vector, SystemContext);\r
}\r
\r
+ // Needed to clear after running the handler\r
MmioWrite32(INTCPS_CONTROL, INTCPS_CONTROL_NEWIRQAGR);\r
}\r
\r