From bb5127aeb7f009783472f4273f532a9ddcefd827 Mon Sep 17 00:00:00 2001 From: andrewfish Date: Wed, 21 Apr 2010 22:08:28 +0000 Subject: Clean up using FIQ as ctrl-c checker so you can break in from the debugger. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10390 6f19259b-4bc3-4df7-8a09-765794883524 --- .../GdbDebugAgent/Arm/ExceptionSupport.ARMv6.S | 10 ++-- .../GdbDebugAgent/Arm/ExceptionSupport.ARMv6.asm | 10 ++-- EmbeddedPkg/Library/GdbDebugAgent/Arm/Processor.c | 58 ++++++++++++++++------ .../Library/GdbDebugAgent/GdbDebugAgent.inf | 1 + 4 files changed, 54 insertions(+), 25 deletions(-) diff --git a/EmbeddedPkg/Library/GdbDebugAgent/Arm/ExceptionSupport.ARMv6.S b/EmbeddedPkg/Library/GdbDebugAgent/Arm/ExceptionSupport.ARMv6.S index bb4d17c..c85dc0b 100755 --- a/EmbeddedPkg/Library/GdbDebugAgent/Arm/ExceptionSupport.ARMv6.S +++ b/EmbeddedPkg/Library/GdbDebugAgent/Arm/ExceptionSupport.ARMv6.S @@ -94,7 +94,7 @@ ASM_PFX(Fiq): ASM_PFX(UndefinedInstructionEntry): sub LR, LR, #4 @ Only -2 for Thumb, adjust in CommonExceptionEntry srsdb #0x13! @ Store return state on SVC stack - cps #0x13 @ Switch to SVC for common stack + cpsid f,#0x13 @ Switch to SVC for common stack stmfd SP!,{LR} @ Store the link register for the current mode sub SP,SP,#0x20 @ Save space for SP, LR, PC, IFAR - CPSR stmfd SP!,{R0-R12} @ Store the register state @@ -106,7 +106,7 @@ ASM_PFX(UndefinedInstructionEntry): ASM_PFX(SoftwareInterruptEntry): sub LR, LR, #4 @ Only -2 for Thumb, adjust in CommonExceptionEntry srsdb #0x13! @ Store return state on SVC stack - @ We are already in SVC mode + cpsid f @ We are already in SVC mode stmfd SP!,{LR} @ Store the link register for the current mode sub SP,SP,#0x20 @ Save space for SP, LR, PC, IFAR - CPSR stmfd SP!,{R0-R12} @ Store the register state @@ -118,7 +118,7 @@ ASM_PFX(SoftwareInterruptEntry): ASM_PFX(PrefetchAbortEntry): sub LR,LR,#4 srsdb #0x13! @ Store return state on SVC stack - cps #0x13 @ Switch to SVC for common stack + cpsid f,#0x13 @ Switch to SVC for common stack stmfd SP!,{LR} @ Store the link register for the current mode sub SP,SP,#0x20 @ Save space for SP, LR, PC, IFAR - CPSR stmfd SP!,{R0-R12} @ Store the register state @@ -130,7 +130,7 @@ ASM_PFX(PrefetchAbortEntry): ASM_PFX(DataAbortEntry): sub LR,LR,#8 srsdb #0x13! @ Store return state on SVC stack - cps #0x13 @ Switch to SVC for common stack + cpsid f,#0x13 @ Switch to SVC for common stack stmfd SP!,{LR} @ Store the link register for the current mode sub SP,SP,#0x20 @ Save space for SP, LR, PC, IFAR - CPSR stmfd SP!,{R0-R12} @ Store the register state @@ -141,7 +141,7 @@ ASM_PFX(DataAbortEntry): ASM_PFX(ReservedExceptionEntry): srsdb #0x13! @ Store return state on SVC stack - cps #0x13 @ Switch to SVC for common stack + cpsid f,#0x13 @ Switch to SVC for common stack stmfd SP!,{LR} @ Store the link register for the current mode sub SP,SP,#0x20 @ Save space for SP, LR, PC, IFAR - CPSR stmfd SP!,{R0-R12} @ Store the register state diff --git a/EmbeddedPkg/Library/GdbDebugAgent/Arm/ExceptionSupport.ARMv6.asm b/EmbeddedPkg/Library/GdbDebugAgent/Arm/ExceptionSupport.ARMv6.asm index 3dccf5b..3468671 100755 --- a/EmbeddedPkg/Library/GdbDebugAgent/Arm/ExceptionSupport.ARMv6.asm +++ b/EmbeddedPkg/Library/GdbDebugAgent/Arm/ExceptionSupport.ARMv6.asm @@ -95,7 +95,7 @@ Fiq UndefinedInstructionEntry sub LR, LR, #4 ; Only -2 for Thumb, adjust in CommonExceptionEntry srsfd #0x13! ; Store return state on SVC stack - cps #0x13 ; Switch to SVC for common stack + cpsid f, #0x13 ; Switch to SVC for common stack stmfd SP!,{LR} ; Store the link register for the current mode sub SP,SP,#0x20 ; Save space for SP, LR, PC, IFAR - CPSR stmfd SP!,{R0-R12} ; Store the register state @@ -107,7 +107,7 @@ UndefinedInstructionEntry SoftwareInterruptEntry sub LR, LR, #4 ; Only -2 for Thumb, adjust in CommonExceptionEntry srsfd #0x13! ; Store return state on SVC stack - ; We are already in SVC mode + cpsid f ; We are already in SVC mode stmfd SP!,{LR} ; Store the link register for the current mode sub SP,SP,#0x20 ; Save space for SP, LR, PC, IFAR - CPSR stmfd SP!,{R0-R12} ; Store the register state @@ -119,7 +119,7 @@ SoftwareInterruptEntry PrefetchAbortEntry sub LR,LR,#4 srsfd #0x13! ; Store return state on SVC stack - cps #0x13 ; Switch to SVC for common stack + cpsid f, #0x13 ; Switch to SVC for common stack stmfd SP!,{LR} ; Store the link register for the current mode sub SP,SP,#0x20 ; Save space for SP, LR, PC, IFAR - CPSR stmfd SP!,{R0-R12} ; Store the register state @@ -131,7 +131,7 @@ PrefetchAbortEntry DataAbortEntry sub LR,LR,#8 srsfd #0x13! ; Store return state on SVC stack - cps #0x13 ; Switch to SVC for common stack + cpsid f, #0x13 ; Switch to SVC for common stack stmfd SP!,{LR} ; Store the link register for the current mode sub SP,SP,#0x20 ; Save space for SP, LR, PC, IFAR - CPSR stmfd SP!,{R0-R12} ; Store the register state @@ -142,7 +142,7 @@ DataAbortEntry ReservedExceptionEntry srsfd #0x13! ; Store return state on SVC stack - cps #0x13 ; Switch to SVC for common stack + cpsid f, #0x13 ; Switch to SVC for common stack stmfd SP!,{LR} ; Store the link register for the current mode sub SP,SP,#0x20 ; Save space for SP, LR, PC, IFAR - CPSR stmfd SP!,{R0-R12} ; Store the register state diff --git a/EmbeddedPkg/Library/GdbDebugAgent/Arm/Processor.c b/EmbeddedPkg/Library/GdbDebugAgent/Arm/Processor.c index e09e18d..21c868a 100755 --- a/EmbeddedPkg/Library/GdbDebugAgent/Arm/Processor.c +++ b/EmbeddedPkg/Library/GdbDebugAgent/Arm/Processor.c @@ -467,6 +467,33 @@ ProcessorSendTSignal ( } /** + FIQ state is only changed by FIQ exception. We don't want to take FIQ + ticks in the GDB stub. The stub disables FIQ on entry, but this is the + third instruction that executes in the execption handler. Thus we have + a crack we need to test for. + + @param PC PC of execption + + @return TRUE We are in the GDB stub exception preamble + @return FALSE We are not in GDB stub code + **/ +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; +} + + +/** Check to see if this exception is related to ctrl-c handling. In this scheme we dedicate FIQ to the ctrl-c handler so it is @@ -486,6 +513,7 @@ ProcessorControlC ( IN OUT EFI_SYSTEM_CONTEXT SystemContext ) { + CHAR8 Char; BOOLEAN Return = TRUE; if (ExceptionType != EXCEPT_ARM_FIQ) { @@ -493,6 +521,12 @@ ProcessorControlC ( return FALSE; } + if (InFiqCrack (SystemContext.SystemContextArm->PC)) { + // We are in our own interrupt preable, so skip this tick. + // We never want to let gdb see the debug stub running if we can help it + return FALSE; + } + 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 ( @param[in] EnableStatus Enable/Disable. - @return FALSE always. + @retval TRUE Debug timer interrupt were enabled on entry to this call. + @retval FALSE Debug timer interrupt were disabled on entry to this call. **/ BOOLEAN @@ -541,7 +577,7 @@ SaveAndSetDebugTimerInterrupt ( FiqEnabled = ArmGetFiqState (); if (EnableStatus) { - DebugAgentTimerSetPeriod (100); + DebugAgentTimerSetPeriod (PcdGet32 (PcdGdbTimerPeriodMilliseconds)); ArmEnableFiq (); } else { DebugAgentTimerSetPeriod (0); @@ -551,6 +587,8 @@ SaveAndSetDebugTimerInterrupt ( return FiqEnabled; } + + VOID GdbFPutString ( IN CHAR8 *String @@ -575,21 +613,14 @@ InitializeDebugAgent ( UINTN Offset; UINTN Length; BOOLEAN IrqEnabled; - BOOLEAN FiqEnabled; UINT32 *VectorBase; - + // // Disable interrupts // IrqEnabled = ArmGetInterruptState (); ArmDisableInterrupts (); - - // - // EFI does not use the FIQ, but a debugger might so we must disable - // as we take over the exception vectors. - // - FiqEnabled = ArmGetFiqState (); ArmDisableFiq (); // @@ -615,12 +646,9 @@ InitializeDebugAgent ( // Flush Caches since we updated executable stuff InvalidateInstructionCacheRange ((VOID *)PcdGet32(PcdCpuVectorBaseAddress), Length); + // setup a timer so gdb can break in via ctrl-c DebugAgentTimerIntialize (); - if (FiqEnabled) { - ArmEnableFiq (); - } - if (IrqEnabled) { ArmEnableInterrupts (); } diff --git a/EmbeddedPkg/Library/GdbDebugAgent/GdbDebugAgent.inf b/EmbeddedPkg/Library/GdbDebugAgent/GdbDebugAgent.inf index 9ccb90b..ed006dc 100755 --- a/EmbeddedPkg/Library/GdbDebugAgent/GdbDebugAgent.inf +++ b/EmbeddedPkg/Library/GdbDebugAgent/GdbDebugAgent.inf @@ -64,6 +64,7 @@ [FixedPcd.common] gEmbeddedTokenSpaceGuid.PcdGdbMaxPacketRetryCount + gEmbeddedTokenSpaceGuid.PcdGdbTimerPeriodMilliseconds [FixedPcd.arm] gArmTokenSpaceGuid.PcdCpuVectorBaseAddress -- cgit v1.1