Fixed a bug in the HardwareInterrupt handler that would blow the stack if you reenabl...
authorAJFISH <AJFISH@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 8 Jan 2010 23:07:33 +0000 (23:07 +0000)
committerAJFISH <AJFISH@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 8 Jan 2010 23:07:33 +0000 (23:07 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9701 6f19259b-4bc3-4df7-8a09-765794883524

ArmPkg/Drivers/CpuDxe/CpuDxe.c
ArmPkg/Drivers/CpuDxe/Exception.c
BeagleBoardPkg/InterruptDxe/HardwareInterrupt.c

index 2b43d2a..d3f0ff5 100644 (file)
@@ -14,7 +14,6 @@
 \r
 #include "CpuDxe.h"\r
 \r
-BOOLEAN gExceptionContext = FALSE;\r
 BOOLEAN mInterruptState   = FALSE;\r
 \r
 EFI_STATUS\r
@@ -49,9 +48,7 @@ CpuEnableInterrupt (
   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
@@ -64,9 +61,7 @@ CpuDisableInterrupt (
   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
index 8859ca8..9910bd2 100644 (file)
@@ -15,8 +15,6 @@
 #include "CpuDxe.h" \r
 #include <Library/CacheMaintenanceLib.h>\r
 \r
-extern BOOLEAN gExceptionContext;\r
-\r
 VOID\r
 ExceptionHandlersStart (\r
   VOID\r
@@ -142,8 +140,7 @@ CommonCExceptionHandler (
 {\r
   BOOLEAN Dispatched = FALSE;\r
  \r
-  gExceptionContext = TRUE; \r
-  \r
\r
   if (ExceptionType <= MAX_ARM_EXCEPTION) {\r
     if (gDebuggerExceptionHandlers[ExceptionType]) {\r
       //\r
@@ -162,8 +159,6 @@ CommonCExceptionHandler (
     ASSERT (FALSE);\r
   }\r
 \r
-  gExceptionContext = FALSE; \r
-\r
   if (Dispatched) {\r
     //\r
     // We did work so this was an expected ExceptionType\r
index 3e69515..c87d564 100644 (file)
@@ -234,12 +234,16 @@ IrqInterruptHandler (
   \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