summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xEmbeddedPkg/Library/GdbDebugAgent/Arm/ExceptionSupport.ARMv6.S10
-rwxr-xr-xEmbeddedPkg/Library/GdbDebugAgent/Arm/ExceptionSupport.ARMv6.asm10
-rwxr-xr-xEmbeddedPkg/Library/GdbDebugAgent/Arm/Processor.c58
-rwxr-xr-xEmbeddedPkg/Library/GdbDebugAgent/GdbDebugAgent.inf1
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