// Array of exception types that need to be hooked by the debugger\r
// (efi, gdb) //efi number\r
//\r
-EFI_EXCEPTION_TYPE_ENTRY gExceptionType[] = {\r
- { EXCEPT_ARM_SOFTWARE_INTERRUPT, GDB_SIGTRAP }\r
-// { EXCEPT_ARM_UNDEFINED_INSTRUCTION, GDB_SIGTRAP },\r
-// { EXCEPT_ARM_PREFETCH_ABORT, GDB_SIGTRAP },\r
-// { EXCEPT_ARM_DATA_ABORT, GDB_SIGEMT },\r
-// { EXCEPT_ARM_RESERVED, GDB_SIGILL }\r
+EFI_EXCEPTION_TYPE_ENTRY gExceptionType[] = {\r
+ { EXCEPT_ARM_SOFTWARE_INTERRUPT, GDB_SIGTRAP }\r
+ // { EXCEPT_ARM_UNDEFINED_INSTRUCTION, GDB_SIGTRAP },\r
+ // { EXCEPT_ARM_PREFETCH_ABORT, GDB_SIGTRAP },\r
+ // { EXCEPT_ARM_DATA_ABORT, GDB_SIGEMT },\r
+ // { EXCEPT_ARM_RESERVED, GDB_SIGILL }\r
};\r
\r
// Shut up some annoying RVCT warnings\r
#ifdef __CC_ARM\r
-#pragma diag_suppress 1296\r
+ #pragma diag_suppress 1296\r
#endif\r
\r
-UINTN gRegisterOffsets[] = {\r
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R0),\r
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R1),\r
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R2),\r
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R3),\r
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R4),\r
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R5),\r
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R6),\r
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R7),\r
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R8),\r
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R9),\r
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R10),\r
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R11),\r
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, R12),\r
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, SP),\r
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, LR),\r
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, PC),\r
- 0x00000F01, // f0\r
+UINTN gRegisterOffsets[] = {\r
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R0),\r
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R1),\r
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R2),\r
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R3),\r
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R4),\r
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R5),\r
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R6),\r
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R7),\r
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R8),\r
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R9),\r
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R10),\r
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R11),\r
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R12),\r
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, SP),\r
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, LR),\r
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, PC),\r
+ 0x00000F01, // f0\r
0x00000F02,\r
0x00000F03,\r
- 0x00000F11, // f1\r
+ 0x00000F11, // f1\r
0x00000F12,\r
0x00000F13,\r
- 0x00000F21, // f2\r
+ 0x00000F21, // f2\r
0x00000F22,\r
0x00000F23,\r
- 0x00000F31, // f3\r
+ 0x00000F31, // f3\r
0x00000F32,\r
0x00000F33,\r
- 0x00000F41, // f4\r
+ 0x00000F41, // f4\r
0x00000F42,\r
0x00000F43,\r
- 0x00000F51, // f5\r
+ 0x00000F51, // f5\r
0x00000F52,\r
0x00000F53,\r
- 0x00000F61, // f6\r
+ 0x00000F61, // f6\r
0x00000F62,\r
0x00000F63,\r
- 0x00000F71, // f7\r
+ 0x00000F71, // f7\r
0x00000F72,\r
0x00000F73,\r
- 0x00000FFF, // fps\r
- OFFSET_OF(EFI_SYSTEM_CONTEXT_ARM, CPSR)\r
+ 0x00000FFF, // fps\r
+ OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, CPSR)\r
};\r
\r
// restore warnings for RVCT\r
#ifdef __CC_ARM\r
-#pragma diag_default 1296\r
+ #pragma diag_default 1296\r
#endif\r
\r
/**\r
return sizeof (gExceptionType) / sizeof (EFI_EXCEPTION_TYPE_ENTRY);\r
}\r
\r
-\r
/**\r
Return the number of entries in the gRegisters[]\r
\r
return sizeof (gRegisterOffsets) / sizeof (UINTN);\r
}\r
\r
-\r
/**\r
Check to see if the ISA is supported.\r
ISA = Instruction Set Architecture\r
}\r
}\r
\r
-\r
/**\r
This takes in the register number and the System Context, and returns a pointer to the RegNumber-th register in gdb ordering\r
It is, by default, set to find the register pointer of the ARM member\r
**/\r
UINTN *\r
FindPointerToRegister (\r
- IN EFI_SYSTEM_CONTEXT SystemContext,\r
- IN UINTN RegNumber\r
+ IN EFI_SYSTEM_CONTEXT SystemContext,\r
+ IN UINTN RegNumber\r
)\r
{\r
- UINT8 *TempPtr;\r
- ASSERT(gRegisterOffsets[RegNumber] < 0xF00);\r
+ UINT8 *TempPtr;\r
+\r
+ ASSERT (gRegisterOffsets[RegNumber] < 0xF00);\r
TempPtr = ((UINT8 *)SystemContext.SystemContextArm) + gRegisterOffsets[RegNumber];\r
return (UINT32 *)TempPtr;\r
}\r
\r
-\r
/**\r
Adds the RegNumber-th register's value to the output buffer, starting at the given OutBufPtr\r
@param SystemContext Register content at time of the exception\r
IN CHAR8 *OutBufPtr\r
)\r
{\r
- UINTN RegSize;\r
- CHAR8 Char;\r
+ UINTN RegSize;\r
+ CHAR8 Char;\r
\r
if (gRegisterOffsets[RegNumber] > 0xF00) {\r
AsciiSPrint (OutBufPtr, 9, "00000000");\r
if ((Char >= 'A') && (Char <= 'F')) {\r
Char = Char - 'A' + 'a';\r
}\r
+\r
*OutBufPtr++ = Char;\r
\r
Char = mHexToStr[(UINT8)((*FindPointerToRegister (SystemContext, RegNumber) >> RegSize) & 0xf)];\r
if ((Char >= 'A') && (Char <= 'F')) {\r
Char = Char - 'A' + 'a';\r
}\r
+\r
*OutBufPtr++ = Char;\r
\r
RegSize = RegSize + 8;\r
}\r
+\r
return OutBufPtr;\r
}\r
\r
-\r
/**\r
Reads the n-th register's value into an output buffer and sends it as a packet\r
@param SystemContext Register content at time of the exception\r
IN CHAR8 *InBuffer\r
)\r
{\r
- UINTN RegNumber;\r
- CHAR8 OutBuffer[9]; // 1 reg=8 hex chars, and the end '\0' (escape seq)\r
- CHAR8 *OutBufPtr; // pointer to the output buffer\r
+ UINTN RegNumber;\r
+ CHAR8 OutBuffer[9]; // 1 reg=8 hex chars, and the end '\0' (escape seq)\r
+ CHAR8 *OutBufPtr; // pointer to the output buffer\r
\r
RegNumber = AsciiStrHexToUintn (&InBuffer[1]);\r
\r
SendPacket (OutBuffer);\r
}\r
\r
-\r
/**\r
Reads the general registers into an output buffer and sends it as a packet\r
@param SystemContext Register content at time of the exception\r
VOID\r
EFIAPI\r
ReadGeneralRegisters (\r
- IN EFI_SYSTEM_CONTEXT SystemContext\r
+ IN EFI_SYSTEM_CONTEXT SystemContext\r
)\r
{\r
- UINTN Index;\r
- CHAR8 *OutBuffer;\r
- CHAR8 *OutBufPtr;\r
- UINTN RegisterCount = MaxRegisterCount ();\r
+ UINTN Index;\r
+ CHAR8 *OutBuffer;\r
+ CHAR8 *OutBufPtr;\r
+ UINTN RegisterCount = MaxRegisterCount ();\r
\r
// It is not safe to allocate pool here....\r
OutBuffer = AllocatePool ((RegisterCount * 8) + 1); // 8 bytes per register in string format plus a null to terminate\r
FreePool (OutBuffer);\r
}\r
\r
-\r
/**\r
Adds the RegNumber-th register's value to the output buffer, starting at the given OutBufPtr\r
@param SystemContext Register content at time of the exception\r
@retval the pointer to the next character of the input buffer that can be used\r
**/\r
CHAR8\r
-*BasicWriteRegister (\r
- IN EFI_SYSTEM_CONTEXT SystemContext,\r
- IN UINTN RegNumber,\r
- IN CHAR8 *InBufPtr\r
+*\r
+BasicWriteRegister (\r
+ IN EFI_SYSTEM_CONTEXT SystemContext,\r
+ IN UINTN RegNumber,\r
+ IN CHAR8 *InBufPtr\r
)\r
{\r
- UINTN RegSize;\r
- UINTN TempValue; // the value transferred from a hex char\r
- UINT32 NewValue; // the new value of the RegNumber-th Register\r
+ UINTN RegSize;\r
+ UINTN TempValue; // the value transferred from a hex char\r
+ UINT32 NewValue; // the new value of the RegNumber-th Register\r
\r
if (gRegisterOffsets[RegNumber] > 0xF00) {\r
return InBufPtr + 8;\r
}\r
\r
NewValue = 0;\r
- RegSize = 0;\r
+ RegSize = 0;\r
while (RegSize < 32) {\r
TempValue = HexCharToInt (*InBufPtr++);\r
\r
}\r
\r
NewValue += (TempValue << RegSize);\r
- RegSize = RegSize + 8;\r
+ RegSize = RegSize + 8;\r
}\r
+\r
*(FindPointerToRegister (SystemContext, RegNumber)) = NewValue;\r
return InBufPtr;\r
}\r
\r
-\r
/** ‘P n...=r...’\r
Writes the new value of n-th register received into the input buffer to the n-th register\r
@param SystemContext Register content at time of the exception\r
**/\r
VOID\r
WriteNthRegister (\r
- IN EFI_SYSTEM_CONTEXT SystemContext,\r
- IN CHAR8 *InBuffer\r
+ IN EFI_SYSTEM_CONTEXT SystemContext,\r
+ IN CHAR8 *InBuffer\r
)\r
{\r
- UINTN RegNumber;\r
- CHAR8 RegNumBuffer[MAX_REG_NUM_BUF_SIZE]; // put the 'n..' part of the message into this array\r
- CHAR8 *RegNumBufPtr;\r
- CHAR8 *InBufPtr; // pointer to the input buffer\r
+ UINTN RegNumber;\r
+ CHAR8 RegNumBuffer[MAX_REG_NUM_BUF_SIZE]; // put the 'n..' part of the message into this array\r
+ CHAR8 *RegNumBufPtr;\r
+ CHAR8 *InBufPtr; // pointer to the input buffer\r
\r
// find the register number to write\r
- InBufPtr = &InBuffer[1];\r
+ InBufPtr = &InBuffer[1];\r
RegNumBufPtr = RegNumBuffer;\r
while (*InBufPtr != '=') {\r
*RegNumBufPtr++ = *InBufPtr++;\r
}\r
+\r
*RegNumBufPtr = '\0';\r
- RegNumber = AsciiStrHexToUintn (RegNumBuffer);\r
+ RegNumber = AsciiStrHexToUintn (RegNumBuffer);\r
\r
// check if this is a valid Register Number\r
if (RegNumber >= MaxRegisterCount ()) {\r
SendError (GDB_EINVALIDREGNUM);\r
return;\r
}\r
+\r
InBufPtr++; // skips the '=' character\r
BasicWriteRegister (SystemContext, RegNumber, InBufPtr);\r
- SendSuccess();\r
+ SendSuccess ();\r
}\r
\r
-\r
/** ‘G XX...’\r
Writes the new values received into the input buffer to the general registers\r
@param SystemContext Register content at time of the exception\r
@param InBuffer Pointer to the input buffer received from gdb server\r
**/\r
-\r
VOID\r
EFIAPI\r
WriteGeneralRegisters (\r
MinLength = (RegisterCount * 8) + 1; // 'G' plus the registers in ASCII format\r
\r
if (AsciiStrLen (InBuffer) < MinLength) {\r
- //Bad message. Message is not the right length\r
+ // Bad message. Message is not the right length\r
SendError (GDB_EBADBUFSIZE);\r
return;\r
}\r
\r
// What about Thumb?\r
// Use SWI 0xdbdbdb as the debug instruction\r
-#define GDB_ARM_BKPT 0xefdbdbdb\r
+#define GDB_ARM_BKPT 0xefdbdbdb\r
\r
-BOOLEAN mSingleStepActive = FALSE;\r
-UINT32 mSingleStepPC;\r
-UINT32 mSingleStepData;\r
-UINTN mSingleStepDataSize;\r
+BOOLEAN mSingleStepActive = FALSE;\r
+UINT32 mSingleStepPC;\r
+UINT32 mSingleStepData;\r
+UINTN mSingleStepDataSize;\r
\r
typedef struct {\r
- LIST_ENTRY Link;\r
- UINT64 Signature;\r
- UINT32 Address;\r
- UINT32 Instruction;\r
+ LIST_ENTRY Link;\r
+ UINT64 Signature;\r
+ UINT32 Address;\r
+ UINT32 Instruction;\r
} ARM_SOFTWARE_BREAKPOINT;\r
\r
-#define ARM_SOFTWARE_BREAKPOINT_SIGNATURE SIGNATURE_64('A', 'R', 'M', 'B', 'R', 'K', 'P', 'T')\r
+#define ARM_SOFTWARE_BREAKPOINT_SIGNATURE SIGNATURE_64('A', 'R', 'M', 'B', 'R', 'K', 'P', 'T')\r
#define ARM_SOFTWARE_BREAKPOINT_FROM_LINK(a) CR(a, ARM_SOFTWARE_BREAKPOINT, Link, ARM_SOFTWARE_BREAKPOINT_SIGNATURE)\r
\r
LIST_ENTRY BreakpointList;\r
**/\r
VOID\r
AddSingleStep (\r
- IN EFI_SYSTEM_CONTEXT SystemContext\r
+ IN EFI_SYSTEM_CONTEXT SystemContext\r
)\r
{\r
if (mSingleStepActive) {\r
// Currently don't support nesting\r
return;\r
}\r
+\r
mSingleStepActive = TRUE;\r
\r
mSingleStepPC = SystemContext.SystemContextArm->PC;\r
\r
- mSingleStepDataSize = sizeof (UINT32);\r
- mSingleStepData = (*(UINT32 *)mSingleStepPC);\r
+ mSingleStepDataSize = sizeof (UINT32);\r
+ mSingleStepData = (*(UINT32 *)mSingleStepPC);\r
*(UINT32 *)mSingleStepPC = GDB_ARM_BKPT;\r
if (*(UINT32 *)mSingleStepPC != GDB_ARM_BKPT) {\r
// For some reason our breakpoint did not take\r
}\r
\r
InvalidateInstructionCacheRange ((VOID *)mSingleStepPC, mSingleStepDataSize);\r
- //DEBUG((DEBUG_ERROR, "AddSingleStep at 0x%08x (was: 0x%08x is:0x%08x)\n", SystemContext.SystemContextArm->PC, mSingleStepData, *(UINT32 *)mSingleStepPC));\r
+ // DEBUG((DEBUG_ERROR, "AddSingleStep at 0x%08x (was: 0x%08x is:0x%08x)\n", SystemContext.SystemContextArm->PC, mSingleStepData, *(UINT32 *)mSingleStepPC));\r
}\r
\r
-\r
/**\r
Remove Single Step in the SystemContext\r
\r
if (mSingleStepDataSize == sizeof (UINT16)) {\r
*(UINT16 *)mSingleStepPC = (UINT16)mSingleStepData;\r
} else {\r
- //DEBUG((DEBUG_ERROR, "RemoveSingleStep at 0x%08x (was: 0x%08x is:0x%08x)\n", SystemContext.SystemContextArm->PC, *(UINT32 *)mSingleStepPC, mSingleStepData));\r
+ // DEBUG((DEBUG_ERROR, "RemoveSingleStep at 0x%08x (was: 0x%08x is:0x%08x)\n", SystemContext.SystemContextArm->PC, *(UINT32 *)mSingleStepPC, mSingleStepData));\r
*(UINT32 *)mSingleStepPC = mSingleStepData;\r
}\r
+\r
InvalidateInstructionCacheRange ((VOID *)mSingleStepPC, mSingleStepDataSize);\r
mSingleStepActive = FALSE;\r
}\r
\r
-\r
-\r
/**\r
Continue. addr is Address to resume. If addr is omitted, resume at current\r
Address.\r
VOID\r
EFIAPI\r
ContinueAtAddress (\r
- IN EFI_SYSTEM_CONTEXT SystemContext,\r
- IN CHAR8 *PacketData\r
+ IN EFI_SYSTEM_CONTEXT SystemContext,\r
+ IN CHAR8 *PacketData\r
)\r
{\r
if (PacketData[1] != '\0') {\r
}\r
}\r
\r
-\r
/** ‘s [addr ]’\r
Single step. addr is the Address at which to resume. If addr is omitted, resume\r
at same Address.\r
VOID\r
EFIAPI\r
SingleStep (\r
- IN EFI_SYSTEM_CONTEXT SystemContext,\r
- IN CHAR8 *PacketData\r
+ IN EFI_SYSTEM_CONTEXT SystemContext,\r
+ IN CHAR8 *PacketData\r
)\r
{\r
SendNotSupported ();\r
IN UINT32 Address\r
)\r
{\r
- LIST_ENTRY *Current;\r
- ARM_SOFTWARE_BREAKPOINT *Breakpoint;\r
+ LIST_ENTRY *Current;\r
+ ARM_SOFTWARE_BREAKPOINT *Breakpoint;\r
\r
Current = GetFirstNode (&BreakpointList);\r
while (!IsNull (&BreakpointList, Current)) {\r
- Breakpoint = ARM_SOFTWARE_BREAKPOINT_FROM_LINK(Current);\r
+ Breakpoint = ARM_SOFTWARE_BREAKPOINT_FROM_LINK (Current);\r
\r
if (Address == Breakpoint->Address) {\r
return Breakpoint;\r
\r
VOID\r
SetBreakpoint (\r
- IN UINT32 Address\r
+ IN UINT32 Address\r
)\r
{\r
- ARM_SOFTWARE_BREAKPOINT *Breakpoint;\r
+ ARM_SOFTWARE_BREAKPOINT *Breakpoint;\r
\r
Breakpoint = SearchBreakpointList (Address);\r
\r
}\r
\r
// create and fill breakpoint structure\r
- Breakpoint = AllocatePool (sizeof(ARM_SOFTWARE_BREAKPOINT));\r
+ Breakpoint = AllocatePool (sizeof (ARM_SOFTWARE_BREAKPOINT));\r
\r
Breakpoint->Signature = ARM_SOFTWARE_BREAKPOINT_SIGNATURE;\r
Breakpoint->Address = Address;\r
*(UINT32 *)Address = GDB_ARM_BKPT;\r
InvalidateInstructionCacheRange ((VOID *)Address, 4);\r
\r
- //DEBUG((DEBUG_ERROR, "SetBreakpoint at 0x%08x (was: 0x%08x is:0x%08x)\n", Address, Breakpoint->Instruction, *(UINT32 *)Address));\r
+ // DEBUG((DEBUG_ERROR, "SetBreakpoint at 0x%08x (was: 0x%08x is:0x%08x)\n", Address, Breakpoint->Instruction, *(UINT32 *)Address));\r
}\r
\r
VOID\r
ClearBreakpoint (\r
- IN UINT32 Address\r
+ IN UINT32 Address\r
)\r
{\r
- ARM_SOFTWARE_BREAKPOINT *Breakpoint;\r
+ ARM_SOFTWARE_BREAKPOINT *Breakpoint;\r
\r
Breakpoint = SearchBreakpointList (Address);\r
\r
*(UINT32 *)Address = Breakpoint->Instruction;\r
InvalidateInstructionCacheRange ((VOID *)Address, 4);\r
\r
- //DEBUG((DEBUG_ERROR, "ClearBreakpoint at 0x%08x (was: 0x%08x is:0x%08x)\n", Address, GDB_ARM_BKPT, *(UINT32 *)Address));\r
+ // DEBUG((DEBUG_ERROR, "ClearBreakpoint at 0x%08x (was: 0x%08x is:0x%08x)\n", Address, GDB_ARM_BKPT, *(UINT32 *)Address));\r
\r
FreePool (Breakpoint);\r
}\r
EFIAPI\r
InsertBreakPoint (\r
IN EFI_SYSTEM_CONTEXT SystemContext,\r
- IN CHAR8 *PacketData\r
+ IN CHAR8 *PacketData\r
)\r
{\r
- UINTN Type;\r
- UINTN Address;\r
- UINTN Length;\r
- UINTN ErrorCode;\r
+ UINTN Type;\r
+ UINTN Address;\r
+ UINTN Length;\r
+ UINTN ErrorCode;\r
\r
ErrorCode = ParseBreakpointPacket (PacketData, &Type, &Address, &Length);\r
if (ErrorCode > 0) {\r
}\r
\r
switch (Type) {\r
- case 0: //Software breakpoint\r
+ case 0: // Software breakpoint\r
break;\r
\r
- default :\r
- DEBUG((DEBUG_ERROR, "Insert breakpoint default: %x\n", Type));\r
+ default:\r
+ DEBUG ((DEBUG_ERROR, "Insert breakpoint default: %x\n", Type));\r
SendError (GDB_EINVALIDBRKPOINTTYPE);\r
return;\r
}\r
IN CHAR8 *PacketData\r
)\r
{\r
- UINTN Type;\r
- UINTN Address;\r
- UINTN Length;\r
- UINTN ErrorCode;\r
+ UINTN Type;\r
+ UINTN Address;\r
+ UINTN Length;\r
+ UINTN ErrorCode;\r
\r
- //Parse breakpoint packet data\r
+ // Parse breakpoint packet data\r
ErrorCode = ParseBreakpointPacket (PacketData, &Type, &Address, &Length);\r
if (ErrorCode > 0) {\r
SendError ((UINT8)ErrorCode);\r
}\r
\r
switch (Type) {\r
- case 0: //Software breakpoint\r
+ case 0: // Software breakpoint\r
break;\r
\r
default:\r
\r
BOOLEAN\r
ValidateException (\r
- IN EFI_EXCEPTION_TYPE ExceptionType,\r
- IN OUT EFI_SYSTEM_CONTEXT SystemContext\r
+ IN EFI_EXCEPTION_TYPE ExceptionType,\r
+ IN OUT EFI_SYSTEM_CONTEXT SystemContext\r
)\r
{\r
UINT32 ExceptionAddress;\r