]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EmbeddedPkg/Library/GdbDebugAgent/Arm/Processor.c
Clean up using FIQ as ctrl-c checker so you can break in from the debugger.
[mirror_edk2.git] / EmbeddedPkg / Library / GdbDebugAgent / Arm / Processor.c
index e09e18d6c1c8eafa72a2c81f7e5797d4a8c30444..21c868aeb2b44fe55b19a183cbae7b609fd244ff 100755 (executable)
@@ -466,6 +466,33 @@ ProcessorSendTSignal (
   *TSignalPtr = '\0';
 }
 \r
+/**\r
+ FIQ state is only changed by FIQ exception. We don't want to take FIQ\r
+ ticks in the GDB stub. The stub disables FIQ on entry, but this is the \r
+ third instruction that executes in the execption handler. Thus we have\r
+ a crack we need to test for.\r
+\r
+ @param PC     PC of execption\r
+\r
+ @return  TRUE  We are in the GDB stub exception preamble \r
+ @return  FALSE We are not in GDB stub code\r
+ **/
+BOOLEAN
+InFiqCrack (
+  IN UINT32 PC
+  )
+{
+  UINT32 VectorBase = PcdGet32 (PcdCpuVectorBaseAddress);
+  UINT32 Length     = (UINTN)ExceptionHandlersEnd - (UINTN)ExceptionHandlersStart;
+
+  if ((PC >= VectorBase) && (PC <= (VectorBase + Length))) {
+    return TRUE;
+  }
+
+  return FALSE;
+}
+\r
+\r
 /**\r
  Check to see if this exception is related to ctrl-c handling.\r
 \r
@@ -486,6 +513,7 @@ ProcessorControlC (
   IN OUT EFI_SYSTEM_CONTEXT     SystemContext \r
   )\r
 {\r
+  CHAR8     Char;\r
   BOOLEAN   Return = TRUE;\r
 \r
   if (ExceptionType != EXCEPT_ARM_FIQ) {\r
@@ -493,6 +521,12 @@ ProcessorControlC (
     return FALSE;\r
   }\r
 \r
+  if (InFiqCrack (SystemContext.SystemContextArm->PC)) {\r
+    // We are in our own interrupt preable, so skip this tick.\r
+    // We never want to let gdb see the debug stub running if we can help it\r
+    return FALSE;\r
+  }\r
+\r
   while (TRUE) {
     if (!GdbIsCharAvailable ()) {
       //
@@ -502,7 +536,8 @@ ProcessorControlC (
       break;
     }
     
-    if (GdbGetChar () == 0x03) {
+    Char = GdbGetChar ();
+    if (Char == 0x03) {
       //
       // We have a ctrl-c so exit and process exception for ctrl-c
       //
@@ -527,7 +562,8 @@ ProcessorControlC (
 \r
   @param[in] EnableStatus    Enable/Disable.\r
 \r
-  @return FALSE always.\r
+  @retval TRUE  Debug timer interrupt were enabled on entry to this call.\r
+  @retval FALSE Debug timer interrupt were disabled on entry to this call.\r
 \r
 **/\r
 BOOLEAN\r
@@ -541,7 +577,7 @@ SaveAndSetDebugTimerInterrupt (
   FiqEnabled = ArmGetFiqState ();\r
 \r
   if (EnableStatus) {\r
-    DebugAgentTimerSetPeriod (100);\r
+    DebugAgentTimerSetPeriod (PcdGet32 (PcdGdbTimerPeriodMilliseconds));\r
     ArmEnableFiq ();\r
   } else {\r
     DebugAgentTimerSetPeriod (0);\r
@@ -551,6 +587,8 @@ SaveAndSetDebugTimerInterrupt (
   return FiqEnabled;\r
 }\r
 \r
+\r
+\r
 VOID\r
 GdbFPutString (\r
   IN CHAR8  *String\r
@@ -575,21 +613,14 @@ InitializeDebugAgent (
   UINTN                Offset;\r
   UINTN                Length;\r
   BOOLEAN              IrqEnabled;\r
-  BOOLEAN              FiqEnabled;\r
   UINT32               *VectorBase;\r
 \r
-    
+
   //\r
   // Disable interrupts\r
   //\r
   IrqEnabled = ArmGetInterruptState ();\r
   ArmDisableInterrupts ();\r
-\r
-  //\r
-  // EFI does not use the FIQ, but a debugger might so we must disable \r
-  // as we take over the exception vectors. \r
-  //\r
-  FiqEnabled = ArmGetFiqState ();\r
   ArmDisableFiq ();\r
 \r
   //\r
@@ -615,12 +646,9 @@ InitializeDebugAgent (
   // Flush Caches since we updated executable stuff\r
   InvalidateInstructionCacheRange ((VOID *)PcdGet32(PcdCpuVectorBaseAddress), Length);\r
 \r
+  // setup a timer so gdb can break in via ctrl-c\r
   DebugAgentTimerIntialize ();\r
 \r
-  if (FiqEnabled) {\r
-    ArmEnableFiq ();\r
-  }\r
-\r
   if (IrqEnabled) {\r
     ArmEnableInterrupts ();\r
   }\r