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):
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

View File

@ -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

View File

@ -466,6 +466,33 @@ ProcessorSendTSignal (
*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.
@ -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 ();
}

View File

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