diff options
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 bb4d17c5ad..c85dc0b33b 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 3dccf5b077..346867149a 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 e09e18d6c1..21c868aeb2 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 9ccb90bf4b..ed006dcabd 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
|