summaryrefslogtreecommitdiffstats
path: root/EmbeddedPkg/GdbStub/Arm/Processor.c
diff options
context:
space:
mode:
Diffstat (limited to 'EmbeddedPkg/GdbStub/Arm/Processor.c')
-rw-r--r--EmbeddedPkg/GdbStub/Arm/Processor.c250
1 files changed, 123 insertions, 127 deletions
diff --git a/EmbeddedPkg/GdbStub/Arm/Processor.c b/EmbeddedPkg/GdbStub/Arm/Processor.c
index bb956b7e79..ec160903a5 100644
--- a/EmbeddedPkg/GdbStub/Arm/Processor.c
+++ b/EmbeddedPkg/GdbStub/Arm/Processor.c
@@ -15,67 +15,67 @@
// Array of exception types that need to be hooked by the debugger
// (efi, gdb) //efi number
//
-EFI_EXCEPTION_TYPE_ENTRY gExceptionType[] = {
- { EXCEPT_ARM_SOFTWARE_INTERRUPT, GDB_SIGTRAP }
-// { EXCEPT_ARM_UNDEFINED_INSTRUCTION, GDB_SIGTRAP },
-// { EXCEPT_ARM_PREFETCH_ABORT, GDB_SIGTRAP },
-// { EXCEPT_ARM_DATA_ABORT, GDB_SIGEMT },
-// { EXCEPT_ARM_RESERVED, GDB_SIGILL }
+EFI_EXCEPTION_TYPE_ENTRY gExceptionType[] = {
+ { EXCEPT_ARM_SOFTWARE_INTERRUPT, GDB_SIGTRAP }
+ // { EXCEPT_ARM_UNDEFINED_INSTRUCTION, GDB_SIGTRAP },
+ // { EXCEPT_ARM_PREFETCH_ABORT, GDB_SIGTRAP },
+ // { EXCEPT_ARM_DATA_ABORT, GDB_SIGEMT },
+ // { EXCEPT_ARM_RESERVED, GDB_SIGILL }
};
// Shut up some annoying RVCT warnings
#ifdef __CC_ARM
-#pragma diag_suppress 1296
+ #pragma diag_suppress 1296
#endif
-UINTN gRegisterOffsets[] = {
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R0),
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R1),
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R2),
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R3),
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R4),
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R5),
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R6),
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R7),
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R8),
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R9),
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R10),
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R11),
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R12),
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, SP),
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, LR),
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, PC),
- 0x00000F01, // f0
+UINTN gRegisterOffsets[] = {
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R0),
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R1),
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R2),
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R3),
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R4),
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R5),
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R6),
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R7),
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R8),
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R9),
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R10),
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R11),
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R12),
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, SP),
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, LR),
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, PC),
+ 0x00000F01, // f0
0x00000F02,
0x00000F03,
- 0x00000F11, // f1
+ 0x00000F11, // f1
0x00000F12,
0x00000F13,
- 0x00000F21, // f2
+ 0x00000F21, // f2
0x00000F22,
0x00000F23,
- 0x00000F31, // f3
+ 0x00000F31, // f3
0x00000F32,
0x00000F33,
- 0x00000F41, // f4
+ 0x00000F41, // f4
0x00000F42,
0x00000F43,
- 0x00000F51, // f5
+ 0x00000F51, // f5
0x00000F52,
0x00000F53,
- 0x00000F61, // f6
+ 0x00000F61, // f6
0x00000F62,
0x00000F63,
- 0x00000F71, // f7
+ 0x00000F71, // f7
0x00000F72,
0x00000F73,
- 0x00000FFF, // fps
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, CPSR)
+ 0x00000FFF, // fps
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, CPSR)
};
// restore warnings for RVCT
#ifdef __CC_ARM
-#pragma diag_default 1296
+ #pragma diag_default 1296
#endif
/**
@@ -91,7 +91,6 @@ MaxEfiException (
return sizeof (gExceptionType) / sizeof (EFI_EXCEPTION_TYPE_ENTRY);
}
-
/**
Return the number of entries in the gRegisters[]
@@ -105,7 +104,6 @@ MaxRegisterCount (
return sizeof (gRegisterOffsets) / sizeof (UINTN);
}
-
/**
Check to see if the ISA is supported.
ISA = Instruction Set Architecture
@@ -125,7 +123,6 @@ CheckIsa (
}
}
-
/**
This takes in the register number and the System Context, and returns a pointer to the RegNumber-th register in gdb ordering
It is, by default, set to find the register pointer of the ARM member
@@ -135,17 +132,17 @@ CheckIsa (
**/
UINTN *
FindPointerToRegister (
- IN EFI_SYSTEM_CONTEXT SystemContext,
- IN UINTN RegNumber
+ IN EFI_SYSTEM_CONTEXT SystemContext,
+ IN UINTN RegNumber
)
{
- UINT8 *TempPtr;
- ASSERT(gRegisterOffsets[RegNumber] < 0xF00);
+ UINT8 *TempPtr;
+
+ ASSERT (gRegisterOffsets[RegNumber] < 0xF00);
TempPtr = ((UINT8 *)SystemContext.SystemContextArm) + gRegisterOffsets[RegNumber];
return (UINT32 *)TempPtr;
}
-
/**
Adds the RegNumber-th register's value to the output buffer, starting at the given OutBufPtr
@param SystemContext Register content at time of the exception
@@ -160,8 +157,8 @@ BasicReadRegister (
IN CHAR8 *OutBufPtr
)
{
- UINTN RegSize;
- CHAR8 Char;
+ UINTN RegSize;
+ CHAR8 Char;
if (gRegisterOffsets[RegNumber] > 0xF00) {
AsciiSPrint (OutBufPtr, 9, "00000000");
@@ -175,20 +172,22 @@ BasicReadRegister (
if ((Char >= 'A') && (Char <= 'F')) {
Char = Char - 'A' + 'a';
}
+
*OutBufPtr++ = Char;
Char = mHexToStr[(UINT8)((*FindPointerToRegister (SystemContext, RegNumber) >> RegSize) & 0xf)];
if ((Char >= 'A') && (Char <= 'F')) {
Char = Char - 'A' + 'a';
}
+
*OutBufPtr++ = Char;
RegSize = RegSize + 8;
}
+
return OutBufPtr;
}
-
/**
Reads the n-th register's value into an output buffer and sends it as a packet
@param SystemContext Register content at time of the exception
@@ -200,9 +199,9 @@ ReadNthRegister (
IN CHAR8 *InBuffer
)
{
- UINTN RegNumber;
- CHAR8 OutBuffer[9]; // 1 reg=8 hex chars, and the end '\0' (escape seq)
- CHAR8 *OutBufPtr; // pointer to the output buffer
+ UINTN RegNumber;
+ CHAR8 OutBuffer[9]; // 1 reg=8 hex chars, and the end '\0' (escape seq)
+ CHAR8 *OutBufPtr; // pointer to the output buffer
RegNumber = AsciiStrHexToUintn (&InBuffer[1]);
@@ -218,7 +217,6 @@ ReadNthRegister (
SendPacket (OutBuffer);
}
-
/**
Reads the general registers into an output buffer and sends it as a packet
@param SystemContext Register content at time of the exception
@@ -226,13 +224,13 @@ ReadNthRegister (
VOID
EFIAPI
ReadGeneralRegisters (
- IN EFI_SYSTEM_CONTEXT SystemContext
+ IN EFI_SYSTEM_CONTEXT SystemContext
)
{
- UINTN Index;
- CHAR8 *OutBuffer;
- CHAR8 *OutBufPtr;
- UINTN RegisterCount = MaxRegisterCount ();
+ UINTN Index;
+ CHAR8 *OutBuffer;
+ CHAR8 *OutBufPtr;
+ UINTN RegisterCount = MaxRegisterCount ();
// It is not safe to allocate pool here....
OutBuffer = AllocatePool ((RegisterCount * 8) + 1); // 8 bytes per register in string format plus a null to terminate
@@ -246,7 +244,6 @@ ReadGeneralRegisters (
FreePool (OutBuffer);
}
-
/**
Adds the RegNumber-th register's value to the output buffer, starting at the given OutBufPtr
@param SystemContext Register content at time of the exception
@@ -255,22 +252,23 @@ ReadGeneralRegisters (
@retval the pointer to the next character of the input buffer that can be used
**/
CHAR8
-*BasicWriteRegister (
- IN EFI_SYSTEM_CONTEXT SystemContext,
- IN UINTN RegNumber,
- IN CHAR8 *InBufPtr
+*
+BasicWriteRegister (
+ IN EFI_SYSTEM_CONTEXT SystemContext,
+ IN UINTN RegNumber,
+ IN CHAR8 *InBufPtr
)
{
- UINTN RegSize;
- UINTN TempValue; // the value transferred from a hex char
- UINT32 NewValue; // the new value of the RegNumber-th Register
+ UINTN RegSize;
+ UINTN TempValue; // the value transferred from a hex char
+ UINT32 NewValue; // the new value of the RegNumber-th Register
if (gRegisterOffsets[RegNumber] > 0xF00) {
return InBufPtr + 8;
}
NewValue = 0;
- RegSize = 0;
+ RegSize = 0;
while (RegSize < 32) {
TempValue = HexCharToInt (*InBufPtr++);
@@ -288,13 +286,13 @@ CHAR8
}
NewValue += (TempValue << RegSize);
- RegSize = RegSize + 8;
+ RegSize = RegSize + 8;
}
+
*(FindPointerToRegister (SystemContext, RegNumber)) = NewValue;
return InBufPtr;
}
-
/** ‘P n...=r...’
Writes the new value of n-th register received into the input buffer to the n-th register
@param SystemContext Register content at time of the exception
@@ -302,41 +300,41 @@ CHAR8
**/
VOID
WriteNthRegister (
- IN EFI_SYSTEM_CONTEXT SystemContext,
- IN CHAR8 *InBuffer
+ IN EFI_SYSTEM_CONTEXT SystemContext,
+ IN CHAR8 *InBuffer
)
{
- UINTN RegNumber;
- CHAR8 RegNumBuffer[MAX_REG_NUM_BUF_SIZE]; // put the 'n..' part of the message into this array
- CHAR8 *RegNumBufPtr;
- CHAR8 *InBufPtr; // pointer to the input buffer
+ UINTN RegNumber;
+ CHAR8 RegNumBuffer[MAX_REG_NUM_BUF_SIZE]; // put the 'n..' part of the message into this array
+ CHAR8 *RegNumBufPtr;
+ CHAR8 *InBufPtr; // pointer to the input buffer
// find the register number to write
- InBufPtr = &InBuffer[1];
+ InBufPtr = &InBuffer[1];
RegNumBufPtr = RegNumBuffer;
while (*InBufPtr != '=') {
*RegNumBufPtr++ = *InBufPtr++;
}
+
*RegNumBufPtr = '\0';
- RegNumber = AsciiStrHexToUintn (RegNumBuffer);
+ RegNumber = AsciiStrHexToUintn (RegNumBuffer);
// check if this is a valid Register Number
if (RegNumber >= MaxRegisterCount ()) {
SendError (GDB_EINVALIDREGNUM);
return;
}
+
InBufPtr++; // skips the '=' character
BasicWriteRegister (SystemContext, RegNumber, InBufPtr);
- SendSuccess();
+ SendSuccess ();
}
-
/** ‘G XX...’
Writes the new values received into the input buffer to the general registers
@param SystemContext Register content at time of the exception
@param InBuffer Pointer to the input buffer received from gdb server
**/
-
VOID
EFIAPI
WriteGeneralRegisters (
@@ -352,7 +350,7 @@ WriteGeneralRegisters (
MinLength = (RegisterCount * 8) + 1; // 'G' plus the registers in ASCII format
if (AsciiStrLen (InBuffer) < MinLength) {
- //Bad message. Message is not the right length
+ // Bad message. Message is not the right length
SendError (GDB_EBADBUFSIZE);
return;
}
@@ -370,21 +368,21 @@ WriteGeneralRegisters (
// What about Thumb?
// Use SWI 0xdbdbdb as the debug instruction
-#define GDB_ARM_BKPT 0xefdbdbdb
+#define GDB_ARM_BKPT 0xefdbdbdb
-BOOLEAN mSingleStepActive = FALSE;
-UINT32 mSingleStepPC;
-UINT32 mSingleStepData;
-UINTN mSingleStepDataSize;
+BOOLEAN mSingleStepActive = FALSE;
+UINT32 mSingleStepPC;
+UINT32 mSingleStepData;
+UINTN mSingleStepDataSize;
typedef struct {
- LIST_ENTRY Link;
- UINT64 Signature;
- UINT32 Address;
- UINT32 Instruction;
+ LIST_ENTRY Link;
+ UINT64 Signature;
+ UINT32 Address;
+ UINT32 Instruction;
} ARM_SOFTWARE_BREAKPOINT;
-#define ARM_SOFTWARE_BREAKPOINT_SIGNATURE SIGNATURE_64('A', 'R', 'M', 'B', 'R', 'K', 'P', 'T')
+#define ARM_SOFTWARE_BREAKPOINT_SIGNATURE SIGNATURE_64('A', 'R', 'M', 'B', 'R', 'K', 'P', 'T')
#define ARM_SOFTWARE_BREAKPOINT_FROM_LINK(a) CR(a, ARM_SOFTWARE_BREAKPOINT, Link, ARM_SOFTWARE_BREAKPOINT_SIGNATURE)
LIST_ENTRY BreakpointList;
@@ -396,19 +394,20 @@ LIST_ENTRY BreakpointList;
**/
VOID
AddSingleStep (
- IN EFI_SYSTEM_CONTEXT SystemContext
+ IN EFI_SYSTEM_CONTEXT SystemContext
)
{
if (mSingleStepActive) {
// Currently don't support nesting
return;
}
+
mSingleStepActive = TRUE;
mSingleStepPC = SystemContext.SystemContextArm->PC;
- mSingleStepDataSize = sizeof (UINT32);
- mSingleStepData = (*(UINT32 *)mSingleStepPC);
+ mSingleStepDataSize = sizeof (UINT32);
+ mSingleStepData = (*(UINT32 *)mSingleStepPC);
*(UINT32 *)mSingleStepPC = GDB_ARM_BKPT;
if (*(UINT32 *)mSingleStepPC != GDB_ARM_BKPT) {
// For some reason our breakpoint did not take
@@ -416,10 +415,9 @@ AddSingleStep (
}
InvalidateInstructionCacheRange ((VOID *)mSingleStepPC, mSingleStepDataSize);
- //DEBUG((DEBUG_ERROR, "AddSingleStep at 0x%08x (was: 0x%08x is:0x%08x)\n", SystemContext.SystemContextArm->PC, mSingleStepData, *(UINT32 *)mSingleStepPC));
+ // DEBUG((DEBUG_ERROR, "AddSingleStep at 0x%08x (was: 0x%08x is:0x%08x)\n", SystemContext.SystemContextArm->PC, mSingleStepData, *(UINT32 *)mSingleStepPC));
}
-
/**
Remove Single Step in the SystemContext
@@ -437,15 +435,14 @@ RemoveSingleStep (
if (mSingleStepDataSize == sizeof (UINT16)) {
*(UINT16 *)mSingleStepPC = (UINT16)mSingleStepData;
} else {
- //DEBUG((DEBUG_ERROR, "RemoveSingleStep at 0x%08x (was: 0x%08x is:0x%08x)\n", SystemContext.SystemContextArm->PC, *(UINT32 *)mSingleStepPC, mSingleStepData));
+ // DEBUG((DEBUG_ERROR, "RemoveSingleStep at 0x%08x (was: 0x%08x is:0x%08x)\n", SystemContext.SystemContextArm->PC, *(UINT32 *)mSingleStepPC, mSingleStepData));
*(UINT32 *)mSingleStepPC = mSingleStepData;
}
+
InvalidateInstructionCacheRange ((VOID *)mSingleStepPC, mSingleStepDataSize);
mSingleStepActive = FALSE;
}
-
-
/**
Continue. addr is Address to resume. If addr is omitted, resume at current
Address.
@@ -455,8 +452,8 @@ RemoveSingleStep (
VOID
EFIAPI
ContinueAtAddress (
- IN EFI_SYSTEM_CONTEXT SystemContext,
- IN CHAR8 *PacketData
+ IN EFI_SYSTEM_CONTEXT SystemContext,
+ IN CHAR8 *PacketData
)
{
if (PacketData[1] != '\0') {
@@ -464,7 +461,6 @@ ContinueAtAddress (
}
}
-
/** ‘s [addr ]’
Single step. addr is the Address at which to resume. If addr is omitted, resume
at same Address.
@@ -474,8 +470,8 @@ ContinueAtAddress (
VOID
EFIAPI
SingleStep (
- IN EFI_SYSTEM_CONTEXT SystemContext,
- IN CHAR8 *PacketData
+ IN EFI_SYSTEM_CONTEXT SystemContext,
+ IN CHAR8 *PacketData
)
{
SendNotSupported ();
@@ -512,12 +508,12 @@ SearchBreakpointList (
IN UINT32 Address
)
{
- LIST_ENTRY *Current;
- ARM_SOFTWARE_BREAKPOINT *Breakpoint;
+ LIST_ENTRY *Current;
+ ARM_SOFTWARE_BREAKPOINT *Breakpoint;
Current = GetFirstNode (&BreakpointList);
while (!IsNull (&BreakpointList, Current)) {
- Breakpoint = ARM_SOFTWARE_BREAKPOINT_FROM_LINK(Current);
+ Breakpoint = ARM_SOFTWARE_BREAKPOINT_FROM_LINK (Current);
if (Address == Breakpoint->Address) {
return Breakpoint;
@@ -531,10 +527,10 @@ SearchBreakpointList (
VOID
SetBreakpoint (
- IN UINT32 Address
+ IN UINT32 Address
)
{
- ARM_SOFTWARE_BREAKPOINT *Breakpoint;
+ ARM_SOFTWARE_BREAKPOINT *Breakpoint;
Breakpoint = SearchBreakpointList (Address);
@@ -543,7 +539,7 @@ SetBreakpoint (
}
// create and fill breakpoint structure
- Breakpoint = AllocatePool (sizeof(ARM_SOFTWARE_BREAKPOINT));
+ Breakpoint = AllocatePool (sizeof (ARM_SOFTWARE_BREAKPOINT));
Breakpoint->Signature = ARM_SOFTWARE_BREAKPOINT_SIGNATURE;
Breakpoint->Address = Address;
@@ -556,15 +552,15 @@ SetBreakpoint (
*(UINT32 *)Address = GDB_ARM_BKPT;
InvalidateInstructionCacheRange ((VOID *)Address, 4);
- //DEBUG((DEBUG_ERROR, "SetBreakpoint at 0x%08x (was: 0x%08x is:0x%08x)\n", Address, Breakpoint->Instruction, *(UINT32 *)Address));
+ // DEBUG((DEBUG_ERROR, "SetBreakpoint at 0x%08x (was: 0x%08x is:0x%08x)\n", Address, Breakpoint->Instruction, *(UINT32 *)Address));
}
VOID
ClearBreakpoint (
- IN UINT32 Address
+ IN UINT32 Address
)
{
- ARM_SOFTWARE_BREAKPOINT *Breakpoint;
+ ARM_SOFTWARE_BREAKPOINT *Breakpoint;
Breakpoint = SearchBreakpointList (Address);
@@ -579,7 +575,7 @@ ClearBreakpoint (
*(UINT32 *)Address = Breakpoint->Instruction;
InvalidateInstructionCacheRange ((VOID *)Address, 4);
- //DEBUG((DEBUG_ERROR, "ClearBreakpoint at 0x%08x (was: 0x%08x is:0x%08x)\n", Address, GDB_ARM_BKPT, *(UINT32 *)Address));
+ // DEBUG((DEBUG_ERROR, "ClearBreakpoint at 0x%08x (was: 0x%08x is:0x%08x)\n", Address, GDB_ARM_BKPT, *(UINT32 *)Address));
FreePool (Breakpoint);
}
@@ -588,13 +584,13 @@ VOID
EFIAPI
InsertBreakPoint (
IN EFI_SYSTEM_CONTEXT SystemContext,
- IN CHAR8 *PacketData
+ IN CHAR8 *PacketData
)
{
- UINTN Type;
- UINTN Address;
- UINTN Length;
- UINTN ErrorCode;
+ UINTN Type;
+ UINTN Address;
+ UINTN Length;
+ UINTN ErrorCode;
ErrorCode = ParseBreakpointPacket (PacketData, &Type, &Address, &Length);
if (ErrorCode > 0) {
@@ -603,11 +599,11 @@ InsertBreakPoint (
}
switch (Type) {
- case 0: //Software breakpoint
+ case 0: // Software breakpoint
break;
- default :
- DEBUG((DEBUG_ERROR, "Insert breakpoint default: %x\n", Type));
+ default:
+ DEBUG ((DEBUG_ERROR, "Insert breakpoint default: %x\n", Type));
SendError (GDB_EINVALIDBRKPOINTTYPE);
return;
}
@@ -624,12 +620,12 @@ RemoveBreakPoint (
IN CHAR8 *PacketData
)
{
- UINTN Type;
- UINTN Address;
- UINTN Length;
- UINTN ErrorCode;
+ UINTN Type;
+ UINTN Address;
+ UINTN Length;
+ UINTN ErrorCode;
- //Parse breakpoint packet data
+ // Parse breakpoint packet data
ErrorCode = ParseBreakpointPacket (PacketData, &Type, &Address, &Length);
if (ErrorCode > 0) {
SendError ((UINT8)ErrorCode);
@@ -637,7 +633,7 @@ RemoveBreakPoint (
}
switch (Type) {
- case 0: //Software breakpoint
+ case 0: // Software breakpoint
break;
default:
@@ -673,8 +669,8 @@ ValidateAddress (
BOOLEAN
ValidateException (
- IN EFI_EXCEPTION_TYPE ExceptionType,
- IN OUT EFI_SYSTEM_CONTEXT SystemContext
+ IN EFI_EXCEPTION_TYPE ExceptionType,
+ IN OUT EFI_SYSTEM_CONTEXT SystemContext
)
{
UINT32 ExceptionAddress;