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
This commit is contained in:
andrewfish 2010-04-21 22:08:28 +00:00
parent 55bff42e00
commit bb5127aeb7
4 changed files with 54 additions and 25 deletions

View File

@ -94,7 +94,7 @@ ASM_PFX(Fiq):
ASM_PFX(UndefinedInstructionEntry): ASM_PFX(UndefinedInstructionEntry):
sub LR, LR, #4 @ Only -2 for Thumb, adjust in CommonExceptionEntry sub LR, LR, #4 @ Only -2 for Thumb, adjust in CommonExceptionEntry
srsdb #0x13! @ Store return state on SVC stack 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 stmfd SP!,{LR} @ Store the link register for the current mode
sub SP,SP,#0x20 @ Save space for SP, LR, PC, IFAR - CPSR sub SP,SP,#0x20 @ Save space for SP, LR, PC, IFAR - CPSR
stmfd SP!,{R0-R12} @ Store the register state stmfd SP!,{R0-R12} @ Store the register state
@ -106,7 +106,7 @@ ASM_PFX(UndefinedInstructionEntry):
ASM_PFX(SoftwareInterruptEntry): ASM_PFX(SoftwareInterruptEntry):
sub LR, LR, #4 @ Only -2 for Thumb, adjust in CommonExceptionEntry sub LR, LR, #4 @ Only -2 for Thumb, adjust in CommonExceptionEntry
srsdb #0x13! @ Store return state on SVC stack 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 stmfd SP!,{LR} @ Store the link register for the current mode
sub SP,SP,#0x20 @ Save space for SP, LR, PC, IFAR - CPSR sub SP,SP,#0x20 @ Save space for SP, LR, PC, IFAR - CPSR
stmfd SP!,{R0-R12} @ Store the register state stmfd SP!,{R0-R12} @ Store the register state
@ -118,7 +118,7 @@ ASM_PFX(SoftwareInterruptEntry):
ASM_PFX(PrefetchAbortEntry): ASM_PFX(PrefetchAbortEntry):
sub LR,LR,#4 sub LR,LR,#4
srsdb #0x13! @ Store return state on SVC stack 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 stmfd SP!,{LR} @ Store the link register for the current mode
sub SP,SP,#0x20 @ Save space for SP, LR, PC, IFAR - CPSR sub SP,SP,#0x20 @ Save space for SP, LR, PC, IFAR - CPSR
stmfd SP!,{R0-R12} @ Store the register state stmfd SP!,{R0-R12} @ Store the register state
@ -130,7 +130,7 @@ ASM_PFX(PrefetchAbortEntry):
ASM_PFX(DataAbortEntry): ASM_PFX(DataAbortEntry):
sub LR,LR,#8 sub LR,LR,#8
srsdb #0x13! @ Store return state on SVC stack 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 stmfd SP!,{LR} @ Store the link register for the current mode
sub SP,SP,#0x20 @ Save space for SP, LR, PC, IFAR - CPSR sub SP,SP,#0x20 @ Save space for SP, LR, PC, IFAR - CPSR
stmfd SP!,{R0-R12} @ Store the register state stmfd SP!,{R0-R12} @ Store the register state
@ -141,7 +141,7 @@ ASM_PFX(DataAbortEntry):
ASM_PFX(ReservedExceptionEntry): ASM_PFX(ReservedExceptionEntry):
srsdb #0x13! @ Store return state on SVC stack 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 stmfd SP!,{LR} @ Store the link register for the current mode
sub SP,SP,#0x20 @ Save space for SP, LR, PC, IFAR - CPSR sub SP,SP,#0x20 @ Save space for SP, LR, PC, IFAR - CPSR
stmfd SP!,{R0-R12} @ Store the register state stmfd SP!,{R0-R12} @ Store the register state

View File

@ -95,7 +95,7 @@ Fiq
UndefinedInstructionEntry UndefinedInstructionEntry
sub LR, LR, #4 ; Only -2 for Thumb, adjust in CommonExceptionEntry sub LR, LR, #4 ; Only -2 for Thumb, adjust in CommonExceptionEntry
srsfd #0x13! ; Store return state on SVC stack 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 stmfd SP!,{LR} ; Store the link register for the current mode
sub SP,SP,#0x20 ; Save space for SP, LR, PC, IFAR - CPSR sub SP,SP,#0x20 ; Save space for SP, LR, PC, IFAR - CPSR
stmfd SP!,{R0-R12} ; Store the register state stmfd SP!,{R0-R12} ; Store the register state
@ -107,7 +107,7 @@ UndefinedInstructionEntry
SoftwareInterruptEntry SoftwareInterruptEntry
sub LR, LR, #4 ; Only -2 for Thumb, adjust in CommonExceptionEntry sub LR, LR, #4 ; Only -2 for Thumb, adjust in CommonExceptionEntry
srsfd #0x13! ; Store return state on SVC stack 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 stmfd SP!,{LR} ; Store the link register for the current mode
sub SP,SP,#0x20 ; Save space for SP, LR, PC, IFAR - CPSR sub SP,SP,#0x20 ; Save space for SP, LR, PC, IFAR - CPSR
stmfd SP!,{R0-R12} ; Store the register state stmfd SP!,{R0-R12} ; Store the register state
@ -119,7 +119,7 @@ SoftwareInterruptEntry
PrefetchAbortEntry PrefetchAbortEntry
sub LR,LR,#4 sub LR,LR,#4
srsfd #0x13! ; Store return state on SVC stack 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 stmfd SP!,{LR} ; Store the link register for the current mode
sub SP,SP,#0x20 ; Save space for SP, LR, PC, IFAR - CPSR sub SP,SP,#0x20 ; Save space for SP, LR, PC, IFAR - CPSR
stmfd SP!,{R0-R12} ; Store the register state stmfd SP!,{R0-R12} ; Store the register state
@ -131,7 +131,7 @@ PrefetchAbortEntry
DataAbortEntry DataAbortEntry
sub LR,LR,#8 sub LR,LR,#8
srsfd #0x13! ; Store return state on SVC stack 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 stmfd SP!,{LR} ; Store the link register for the current mode
sub SP,SP,#0x20 ; Save space for SP, LR, PC, IFAR - CPSR sub SP,SP,#0x20 ; Save space for SP, LR, PC, IFAR - CPSR
stmfd SP!,{R0-R12} ; Store the register state stmfd SP!,{R0-R12} ; Store the register state
@ -142,7 +142,7 @@ DataAbortEntry
ReservedExceptionEntry ReservedExceptionEntry
srsfd #0x13! ; Store return state on SVC stack 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 stmfd SP!,{LR} ; Store the link register for the current mode
sub SP,SP,#0x20 ; Save space for SP, LR, PC, IFAR - CPSR sub SP,SP,#0x20 ; Save space for SP, LR, PC, IFAR - CPSR
stmfd SP!,{R0-R12} ; Store the register state stmfd SP!,{R0-R12} ; Store the register state

View File

@ -466,6 +466,33 @@ ProcessorSendTSignal (
*TSignalPtr = '\0'; *TSignalPtr = '\0';
} }
/**
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. Check to see if this exception is related to ctrl-c handling.
@ -486,6 +513,7 @@ ProcessorControlC (
IN OUT EFI_SYSTEM_CONTEXT SystemContext IN OUT EFI_SYSTEM_CONTEXT SystemContext
) )
{ {
CHAR8 Char;
BOOLEAN Return = TRUE; BOOLEAN Return = TRUE;
if (ExceptionType != EXCEPT_ARM_FIQ) { if (ExceptionType != EXCEPT_ARM_FIQ) {
@ -493,6 +521,12 @@ ProcessorControlC (
return FALSE; 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) { while (TRUE) {
if (!GdbIsCharAvailable ()) { if (!GdbIsCharAvailable ()) {
// //
@ -502,7 +536,8 @@ ProcessorControlC (
break; break;
} }
if (GdbGetChar () == 0x03) { Char = GdbGetChar ();
if (Char == 0x03) {
// //
// We have a ctrl-c so exit and process exception for ctrl-c // We have a ctrl-c so exit and process exception for ctrl-c
// //
@ -527,7 +562,8 @@ ProcessorControlC (
@param[in] EnableStatus Enable/Disable. @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 BOOLEAN
@ -541,7 +577,7 @@ SaveAndSetDebugTimerInterrupt (
FiqEnabled = ArmGetFiqState (); FiqEnabled = ArmGetFiqState ();
if (EnableStatus) { if (EnableStatus) {
DebugAgentTimerSetPeriod (100); DebugAgentTimerSetPeriod (PcdGet32 (PcdGdbTimerPeriodMilliseconds));
ArmEnableFiq (); ArmEnableFiq ();
} else { } else {
DebugAgentTimerSetPeriod (0); DebugAgentTimerSetPeriod (0);
@ -551,6 +587,8 @@ SaveAndSetDebugTimerInterrupt (
return FiqEnabled; return FiqEnabled;
} }
VOID VOID
GdbFPutString ( GdbFPutString (
IN CHAR8 *String IN CHAR8 *String
@ -575,21 +613,14 @@ InitializeDebugAgent (
UINTN Offset; UINTN Offset;
UINTN Length; UINTN Length;
BOOLEAN IrqEnabled; BOOLEAN IrqEnabled;
BOOLEAN FiqEnabled;
UINT32 *VectorBase; UINT32 *VectorBase;
// //
// Disable interrupts // Disable interrupts
// //
IrqEnabled = ArmGetInterruptState (); IrqEnabled = ArmGetInterruptState ();
ArmDisableInterrupts (); 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 (); ArmDisableFiq ();
// //
@ -615,12 +646,9 @@ InitializeDebugAgent (
// Flush Caches since we updated executable stuff // Flush Caches since we updated executable stuff
InvalidateInstructionCacheRange ((VOID *)PcdGet32(PcdCpuVectorBaseAddress), Length); InvalidateInstructionCacheRange ((VOID *)PcdGet32(PcdCpuVectorBaseAddress), Length);
// setup a timer so gdb can break in via ctrl-c
DebugAgentTimerIntialize (); DebugAgentTimerIntialize ();
if (FiqEnabled) {
ArmEnableFiq ();
}
if (IrqEnabled) { if (IrqEnabled) {
ArmEnableInterrupts (); ArmEnableInterrupts ();
} }

View File

@ -64,6 +64,7 @@
[FixedPcd.common] [FixedPcd.common]
gEmbeddedTokenSpaceGuid.PcdGdbMaxPacketRetryCount gEmbeddedTokenSpaceGuid.PcdGdbMaxPacketRetryCount
gEmbeddedTokenSpaceGuid.PcdGdbTimerPeriodMilliseconds
[FixedPcd.arm] [FixedPcd.arm]
gArmTokenSpaceGuid.PcdCpuVectorBaseAddress gArmTokenSpaceGuid.PcdCpuVectorBaseAddress