EmbeddedPkg: Apply uncrustify changes
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737 Apply uncrustify changes to .c/.h files in the EmbeddedPkg package Cc: Andrew Fish <afish@apple.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Reviewed-by: Andrew Fish <afish@apple.com>
This commit is contained in:
committed by
mergify[bot]
parent
731c67e1d7
commit
e7108d0e96
@@ -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;
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -28,54 +28,51 @@
|
||||
#include <Guid/DebugImageInfoTable.h>
|
||||
#include <IndustryStandard/PeImage.h>
|
||||
|
||||
extern CONST CHAR8 mHexToStr[];
|
||||
extern CONST CHAR8 mHexToStr[];
|
||||
|
||||
// maximum size of input and output buffers
|
||||
// This value came from the show remote command of the gdb we tested against
|
||||
#define MAX_BUF_SIZE 2000
|
||||
#define MAX_BUF_SIZE 2000
|
||||
|
||||
// maximum size of address buffer
|
||||
#define MAX_ADDR_SIZE 32
|
||||
#define MAX_ADDR_SIZE 32
|
||||
|
||||
// maximum size of register number buffer
|
||||
#define MAX_REG_NUM_BUF_SIZE 32
|
||||
#define MAX_REG_NUM_BUF_SIZE 32
|
||||
|
||||
// maximum size of length buffer
|
||||
#define MAX_LENGTH_SIZE 32
|
||||
#define MAX_LENGTH_SIZE 32
|
||||
|
||||
// maximum size of T signal members
|
||||
#define MAX_T_SIGNAL_SIZE 64
|
||||
#define MAX_T_SIGNAL_SIZE 64
|
||||
|
||||
// the mask used to clear all the cache
|
||||
#define TF_BIT 0x00000100
|
||||
|
||||
#define TF_BIT 0x00000100
|
||||
|
||||
//
|
||||
// GDB Signal definitions - generic names for interrupts
|
||||
//
|
||||
#define GDB_SIGILL 4 // Illegal instruction
|
||||
#define GDB_SIGTRAP 5 // Trace Trap (Breakpoint and SingleStep)
|
||||
#define GDB_SIGEMT 7 // Emulator Trap
|
||||
#define GDB_SIGFPE 8 // Floating point exception
|
||||
#define GDB_SIGSEGV 11 // Segment violation, page fault
|
||||
|
||||
#define GDB_SIGILL 4 // Illegal instruction
|
||||
#define GDB_SIGTRAP 5 // Trace Trap (Breakpoint and SingleStep)
|
||||
#define GDB_SIGEMT 7 // Emulator Trap
|
||||
#define GDB_SIGFPE 8 // Floating point exception
|
||||
#define GDB_SIGSEGV 11 // Segment violation, page fault
|
||||
|
||||
//
|
||||
// GDB File I/O Error values, zero means no error
|
||||
// Includes all general GDB Unix like error values
|
||||
//
|
||||
#define GDB_EBADMEMADDRBUFSIZE 11 // the buffer that stores memory Address to be read from/written to is not the right size
|
||||
#define GDB_EBADMEMLENGBUFSIZE 12 // the buffer that stores Length is not the right size
|
||||
#define GDB_EBADMEMLENGTH 13 // Length, the given number of bytes to read or write, is not the right size
|
||||
#define GDB_EBADMEMDATA 14 // one of the bytes or nibbles of the memory is less than 0
|
||||
#define GDB_EBADMEMDATASIZE 15 // the memory data, 'XX..', is too short or too long
|
||||
#define GDB_EBADBUFSIZE 21 // the buffer created is not the correct size
|
||||
#define GDB_EINVALIDARG 31 // argument is invalid
|
||||
#define GDB_ENOSPACE 41 //
|
||||
#define GDB_EINVALIDBRKPOINTTYPE 51 // the breakpoint type is not recognized
|
||||
#define GDB_EINVALIDREGNUM 61 // given register number is not valid: either <0 or >=Number of Registers
|
||||
#define GDB_EUNKNOWN 255 // unknown
|
||||
|
||||
#define GDB_EBADMEMADDRBUFSIZE 11 // the buffer that stores memory Address to be read from/written to is not the right size
|
||||
#define GDB_EBADMEMLENGBUFSIZE 12 // the buffer that stores Length is not the right size
|
||||
#define GDB_EBADMEMLENGTH 13 // Length, the given number of bytes to read or write, is not the right size
|
||||
#define GDB_EBADMEMDATA 14 // one of the bytes or nibbles of the memory is less than 0
|
||||
#define GDB_EBADMEMDATASIZE 15 // the memory data, 'XX..', is too short or too long
|
||||
#define GDB_EBADBUFSIZE 21 // the buffer created is not the correct size
|
||||
#define GDB_EINVALIDARG 31 // argument is invalid
|
||||
#define GDB_ENOSPACE 41 //
|
||||
#define GDB_EINVALIDBRKPOINTTYPE 51 // the breakpoint type is not recognized
|
||||
#define GDB_EINVALIDREGNUM 61 // given register number is not valid: either <0 or >=Number of Registers
|
||||
#define GDB_EUNKNOWN 255 // unknown
|
||||
|
||||
//
|
||||
// These devices are open by GDB so we can just read and write to them
|
||||
@@ -85,7 +82,7 @@ extern CONST CHAR8 mHexToStr[];
|
||||
#define GDB_STDERR 0x02
|
||||
|
||||
//
|
||||
//Define Register size for different architectures
|
||||
// Define Register size for different architectures
|
||||
//
|
||||
#if defined (MDE_CPU_IA32)
|
||||
#define REG_SIZE 32
|
||||
@@ -95,12 +92,12 @@ extern CONST CHAR8 mHexToStr[];
|
||||
#define REG_SIZE 32
|
||||
#endif
|
||||
|
||||
#define GDB_SERIAL_DEV_SIGNATURE SIGNATURE_32 ('g', 'd', 'b', 's')
|
||||
#define GDB_SERIAL_DEV_SIGNATURE SIGNATURE_32 ('g', 'd', 'b', 's')
|
||||
|
||||
typedef struct {
|
||||
VENDOR_DEVICE_PATH VendorDevice;
|
||||
UINT32 Index; // Support more than one
|
||||
EFI_DEVICE_PATH_PROTOCOL End;
|
||||
VENDOR_DEVICE_PATH VendorDevice;
|
||||
UINT32 Index; // Support more than one
|
||||
EFI_DEVICE_PATH_PROTOCOL End;
|
||||
} GDB_SERIAL_DEVICE_PATH;
|
||||
|
||||
//
|
||||
@@ -113,25 +110,22 @@ typedef struct {
|
||||
// DevicePath EFI_DEVICE_PATH_PROTOCOL *: Device path of the serial device
|
||||
//
|
||||
typedef struct {
|
||||
UINTN Signature;
|
||||
EFI_HANDLE Handle;
|
||||
EFI_SERIAL_IO_PROTOCOL SerialIo;
|
||||
EFI_SERIAL_IO_MODE SerialMode;
|
||||
GDB_SERIAL_DEVICE_PATH DevicePath;
|
||||
INTN InFileDescriptor;
|
||||
INTN OutFileDescriptor;
|
||||
UINTN Signature;
|
||||
EFI_HANDLE Handle;
|
||||
EFI_SERIAL_IO_PROTOCOL SerialIo;
|
||||
EFI_SERIAL_IO_MODE SerialMode;
|
||||
GDB_SERIAL_DEVICE_PATH DevicePath;
|
||||
INTN InFileDescriptor;
|
||||
INTN OutFileDescriptor;
|
||||
} GDB_SERIAL_DEV;
|
||||
|
||||
|
||||
#define GDB_SERIAL_DEV_FROM_THIS(a) CR (a, GDB_SERIAL_DEV, SerialIo, GDB_SERIAL_DEV_SIGNATURE)
|
||||
|
||||
#define GDB_SERIAL_DEV_FROM_THIS(a) CR (a, GDB_SERIAL_DEV, SerialIo, GDB_SERIAL_DEV_SIGNATURE)
|
||||
|
||||
typedef struct {
|
||||
EFI_EXCEPTION_TYPE Exception;
|
||||
UINT8 SignalNo;
|
||||
EFI_EXCEPTION_TYPE Exception;
|
||||
UINT8 SignalNo;
|
||||
} EFI_EXCEPTION_TYPE_ENTRY;
|
||||
|
||||
|
||||
#if defined (MDE_CPU_IA32) || defined (MDE_CPU_X64)
|
||||
|
||||
//
|
||||
@@ -141,17 +135,17 @@ typedef struct {
|
||||
//
|
||||
typedef union {
|
||||
struct {
|
||||
UINT32 B0:1; // Breakpoint condition detected
|
||||
UINT32 B1:1; // Breakpoint condition detected
|
||||
UINT32 B2:1; // Breakpoint condition detected
|
||||
UINT32 B3:1; // Breakpoint condition detected
|
||||
UINT32 Reserved_1:9; // Reserved
|
||||
UINT32 BD:1; // Debug register access detected
|
||||
UINT32 BS:1; // Single step
|
||||
UINT32 BT:1; // Task switch
|
||||
UINT32 Reserved_2:16; // Reserved
|
||||
UINT32 B0 : 1; // Breakpoint condition detected
|
||||
UINT32 B1 : 1; // Breakpoint condition detected
|
||||
UINT32 B2 : 1; // Breakpoint condition detected
|
||||
UINT32 B3 : 1; // Breakpoint condition detected
|
||||
UINT32 Reserved_1 : 9; // Reserved
|
||||
UINT32 BD : 1; // Debug register access detected
|
||||
UINT32 BS : 1; // Single step
|
||||
UINT32 BT : 1; // Task switch
|
||||
UINT32 Reserved_2 : 16; // Reserved
|
||||
} Bits;
|
||||
UINTN UintN;
|
||||
UINTN UintN;
|
||||
} IA32_DR6;
|
||||
|
||||
//
|
||||
@@ -161,65 +155,64 @@ typedef union {
|
||||
//
|
||||
typedef union {
|
||||
struct {
|
||||
UINT32 L0:1; // Local breakpoint enable
|
||||
UINT32 G0:1; // Global breakpoint enable
|
||||
UINT32 L1:1; // Local breakpoint enable
|
||||
UINT32 G1:1; // Global breakpoint enable
|
||||
UINT32 L2:1; // Local breakpoint enable
|
||||
UINT32 G2:1; // Global breakpoint enable
|
||||
UINT32 L3:1; // Local breakpoint enable
|
||||
UINT32 G3:1; // Global breakpoint enable
|
||||
UINT32 LE:1; // Local exact breakpoint enable
|
||||
UINT32 GE:1; // Global exact breakpoint enable
|
||||
UINT32 Reserved_1:3; // Reserved
|
||||
UINT32 GD:1; // Global detect enable
|
||||
UINT32 Reserved_2:2; // Reserved
|
||||
UINT32 RW0:2; // Read/Write field
|
||||
UINT32 LEN0:2; // Length field
|
||||
UINT32 RW1:2; // Read/Write field
|
||||
UINT32 LEN1:2; // Length field
|
||||
UINT32 RW2:2; // Read/Write field
|
||||
UINT32 LEN2:2; // Length field
|
||||
UINT32 RW3:2; // Read/Write field
|
||||
UINT32 LEN3:2; // Length field
|
||||
UINT32 L0 : 1; // Local breakpoint enable
|
||||
UINT32 G0 : 1; // Global breakpoint enable
|
||||
UINT32 L1 : 1; // Local breakpoint enable
|
||||
UINT32 G1 : 1; // Global breakpoint enable
|
||||
UINT32 L2 : 1; // Local breakpoint enable
|
||||
UINT32 G2 : 1; // Global breakpoint enable
|
||||
UINT32 L3 : 1; // Local breakpoint enable
|
||||
UINT32 G3 : 1; // Global breakpoint enable
|
||||
UINT32 LE : 1; // Local exact breakpoint enable
|
||||
UINT32 GE : 1; // Global exact breakpoint enable
|
||||
UINT32 Reserved_1 : 3; // Reserved
|
||||
UINT32 GD : 1; // Global detect enable
|
||||
UINT32 Reserved_2 : 2; // Reserved
|
||||
UINT32 RW0 : 2; // Read/Write field
|
||||
UINT32 LEN0 : 2; // Length field
|
||||
UINT32 RW1 : 2; // Read/Write field
|
||||
UINT32 LEN1 : 2; // Length field
|
||||
UINT32 RW2 : 2; // Read/Write field
|
||||
UINT32 LEN2 : 2; // Length field
|
||||
UINT32 RW3 : 2; // Read/Write field
|
||||
UINT32 LEN3 : 2; // Length field
|
||||
} Bits;
|
||||
UINTN UintN;
|
||||
UINTN UintN;
|
||||
} IA32_DR7;
|
||||
|
||||
#endif /* if defined (MDE_CPU_IA32) || defined (MDE_CPU_X64) */
|
||||
|
||||
typedef enum {
|
||||
InstructionExecution, //Hardware breakpoint
|
||||
DataWrite, //watch
|
||||
DataRead, //rwatch
|
||||
DataReadWrite, //awatch
|
||||
SoftwareBreakpoint, //Software breakpoint
|
||||
InstructionExecution, // Hardware breakpoint
|
||||
DataWrite, // watch
|
||||
DataRead, // rwatch
|
||||
DataReadWrite, // awatch
|
||||
SoftwareBreakpoint, // Software breakpoint
|
||||
NotSupported
|
||||
} BREAK_TYPE;
|
||||
|
||||
//
|
||||
// Array of exception types that need to be hooked by the debugger
|
||||
//
|
||||
extern EFI_EXCEPTION_TYPE_ENTRY gExceptionType[];
|
||||
extern EFI_EXCEPTION_TYPE_ENTRY gExceptionType[];
|
||||
|
||||
//
|
||||
// Set TRUE if F Reply package signals a ctrl-c. We can not process the Ctrl-c
|
||||
// here we need to wait for the periodic callback to do this.
|
||||
//
|
||||
extern BOOLEAN gCtrlCBreakFlag;
|
||||
extern BOOLEAN gCtrlCBreakFlag;
|
||||
|
||||
//
|
||||
// If the periodic callback is called while we are processing an F packet we need
|
||||
// to let the callback know to not read from the serial stream as it could steal
|
||||
// characters from the F response packet
|
||||
//
|
||||
extern BOOLEAN gProcessingFPacket;
|
||||
|
||||
extern BOOLEAN gProcessingFPacket;
|
||||
|
||||
// The offsets of registers SystemContext.
|
||||
// The fields in the array are in the gdb ordering.
|
||||
//
|
||||
extern UINTN gRegisterOffsets[];
|
||||
extern UINTN gRegisterOffsets[];
|
||||
|
||||
/**
|
||||
Return the number of entries in the gExceptionType[]
|
||||
@@ -231,7 +224,6 @@ MaxEfiException (
|
||||
VOID
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Return the number of entries in the gRegisters[]
|
||||
|
||||
@@ -242,7 +234,6 @@ MaxRegisterCount (
|
||||
VOID
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Check to see if the ISA is supported.
|
||||
ISA = Instruction Set Architecture
|
||||
@@ -252,10 +243,9 @@ MaxRegisterCount (
|
||||
**/
|
||||
BOOLEAN
|
||||
CheckIsa (
|
||||
IN EFI_INSTRUCTION_SET_ARCHITECTURE Isa
|
||||
IN EFI_INSTRUCTION_SET_ARCHITECTURE Isa
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Send the T signal with the given exception type (in gdb order) and possibly with n:r pairs related to the watchpoints
|
||||
|
||||
@@ -269,7 +259,6 @@ GdbSendTSignal (
|
||||
IN UINT8 GdbExceptionType
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Translates the EFI mapping to GDB mapping
|
||||
|
||||
@@ -278,10 +267,9 @@ GdbSendTSignal (
|
||||
**/
|
||||
UINT8
|
||||
ConvertEFItoGDBtype (
|
||||
IN EFI_EXCEPTION_TYPE EFIExceptionType
|
||||
IN EFI_EXCEPTION_TYPE EFIExceptionType
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Empties the given buffer
|
||||
@param *Buf pointer to the first element in buffer to be emptied
|
||||
@@ -291,7 +279,6 @@ EmptyBuffer (
|
||||
IN CHAR8 *Buf
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Converts an 8-bit Hex Char into a INTN.
|
||||
|
||||
@@ -301,10 +288,9 @@ EmptyBuffer (
|
||||
**/
|
||||
INTN
|
||||
HexCharToInt (
|
||||
IN CHAR8 Char
|
||||
IN CHAR8 Char
|
||||
);
|
||||
|
||||
|
||||
/** 'E NN'
|
||||
Send an error with the given error number after converting to hex.
|
||||
The error number is put into the buffer in hex. '255' is the biggest errno we can send.
|
||||
@@ -315,10 +301,9 @@ HexCharToInt (
|
||||
VOID
|
||||
EFIAPI
|
||||
SendError (
|
||||
IN UINT8 ErrorNum
|
||||
IN UINT8 ErrorNum
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Send 'OK' when the function is done executing successfully.
|
||||
**/
|
||||
@@ -328,7 +313,6 @@ SendSuccess (
|
||||
VOID
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Send empty packet to specify that particular command/functionality is not supported.
|
||||
**/
|
||||
@@ -349,7 +333,6 @@ ReadNthRegister (
|
||||
IN CHAR8 *InBuffer
|
||||
);
|
||||
|
||||
|
||||
/** ‘g’
|
||||
Reads the general registers into an output buffer and sends it as a packet
|
||||
@param SystemContext Register content at time of the exception
|
||||
@@ -360,7 +343,6 @@ ReadGeneralRegisters (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext
|
||||
);
|
||||
|
||||
|
||||
/** ‘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
|
||||
@@ -373,7 +355,6 @@ WriteNthRegister (
|
||||
IN CHAR8 *InBuffer
|
||||
);
|
||||
|
||||
|
||||
/** ‘G XX...’
|
||||
Writes the new values received into the input buffer to the general registers
|
||||
@param SystemContext Register content at time of the exception
|
||||
@@ -387,7 +368,6 @@ WriteGeneralRegisters (
|
||||
IN CHAR8 *InBuffer
|
||||
);
|
||||
|
||||
|
||||
/** ‘m addr,length ’
|
||||
Find the Length of the area to read and the start address. Finally, pass them to
|
||||
another function, TransferFromMemToOutBufAndSend, that will read from that memory space and
|
||||
@@ -401,7 +381,6 @@ ReadFromMemory (
|
||||
IN CHAR8 *PacketData
|
||||
);
|
||||
|
||||
|
||||
/** ‘M addr,length :XX...’
|
||||
Find the Length of the area in bytes to write and the start address. Finally, pass them to
|
||||
another function, TransferFromInBufToMem, that will write to that memory space the info in
|
||||
@@ -412,10 +391,9 @@ ReadFromMemory (
|
||||
VOID
|
||||
EFIAPI
|
||||
WriteToMemory (
|
||||
IN CHAR8 *PacketData
|
||||
IN CHAR8 *PacketData
|
||||
);
|
||||
|
||||
|
||||
/** ‘c [addr ]’
|
||||
Continue. addr is Address to resume. If addr is omitted, resume at current
|
||||
Address.
|
||||
@@ -427,11 +405,10 @@ WriteToMemory (
|
||||
VOID
|
||||
EFIAPI
|
||||
ContinueAtAddress (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN CHAR8 *PacketData
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN CHAR8 *PacketData
|
||||
);
|
||||
|
||||
|
||||
/** ‘s [addr ]’
|
||||
Single step. addr is the Address at which to resume. If addr is omitted, resume
|
||||
at same Address.
|
||||
@@ -466,7 +443,6 @@ RemoveSingleStep (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
‘Z1, [addr], [length]’
|
||||
‘Z2, [addr], [length]’
|
||||
@@ -481,12 +457,11 @@ RemoveSingleStep (
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
InsertBreakPoint(
|
||||
InsertBreakPoint (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN CHAR8 *PacketData
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
‘z1, [addr], [length]’
|
||||
‘z2, [addr], [length]’
|
||||
@@ -501,12 +476,11 @@ InsertBreakPoint(
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
RemoveBreakPoint(
|
||||
RemoveBreakPoint (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN CHAR8 *PacketData
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Exception Handler for GDB. It will be called for all exceptions
|
||||
registered via the gExceptionType[] array.
|
||||
@@ -522,7 +496,6 @@ GdbExceptionHandler (
|
||||
IN OUT EFI_SYSTEM_CONTEXT SystemContext
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Periodic callback for GDB. This function is used to catch a ctrl-c or other
|
||||
break in type command from GDB.
|
||||
@@ -536,7 +509,6 @@ GdbPeriodicCallBack (
|
||||
IN OUT EFI_SYSTEM_CONTEXT SystemContext
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Make two serial consoles: 1) StdIn and StdOut via GDB. 2) StdErr via GDB.
|
||||
|
||||
@@ -549,7 +521,6 @@ GdbInitializeSerialConsole (
|
||||
VOID
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Send a GDB Remote Serial Protocol Packet
|
||||
|
||||
@@ -566,10 +537,9 @@ GdbInitializeSerialConsole (
|
||||
**/
|
||||
UINTN
|
||||
SendPacket (
|
||||
IN CHAR8 *PacketData
|
||||
IN CHAR8 *PacketData
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Receive a GDB Remote Serial Protocol Packet
|
||||
|
||||
@@ -588,10 +558,9 @@ SendPacket (
|
||||
**/
|
||||
UINTN
|
||||
ReceivePacket (
|
||||
OUT CHAR8 *PacketData,
|
||||
IN UINTN PacketDataSize
|
||||
);
|
||||
|
||||
OUT CHAR8 *PacketData,
|
||||
IN UINTN PacketDataSize
|
||||
);
|
||||
|
||||
/**
|
||||
Read data from a FileDescriptor. On success number of bytes read is returned. Zero indicates
|
||||
@@ -607,12 +576,11 @@ ReceivePacket (
|
||||
**/
|
||||
INTN
|
||||
GdbRead (
|
||||
IN INTN FileDescriptor,
|
||||
OUT VOID *Buffer,
|
||||
IN UINTN Count
|
||||
IN INTN FileDescriptor,
|
||||
OUT VOID *Buffer,
|
||||
IN UINTN Count
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Write data to a FileDescriptor. On success number of bytes written is returned. Zero indicates
|
||||
nothing was written. On error -1 is returned.
|
||||
@@ -627,29 +595,29 @@ GdbRead (
|
||||
**/
|
||||
INTN
|
||||
GdbWrite (
|
||||
IN INTN FileDescriptor,
|
||||
OUT CONST VOID *Buffer,
|
||||
IN UINTN Count
|
||||
IN INTN FileDescriptor,
|
||||
OUT CONST VOID *Buffer,
|
||||
IN UINTN Count
|
||||
);
|
||||
|
||||
UINTN *
|
||||
FindPointerToRegister (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN UINTN RegNumber
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN UINTN RegNumber
|
||||
);
|
||||
|
||||
CHAR8 *
|
||||
BasicReadRegister (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN UINTN RegNumber,
|
||||
IN CHAR8 *OutBufPtr
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN UINTN RegNumber,
|
||||
IN CHAR8 *OutBufPtr
|
||||
);
|
||||
|
||||
VOID
|
||||
TransferFromInBufToMem (
|
||||
IN UINTN Length,
|
||||
IN UINT8 *Address,
|
||||
IN CHAR8 *NewData
|
||||
IN UINTN Length,
|
||||
IN UINT8 *Address,
|
||||
IN CHAR8 *NewData
|
||||
);
|
||||
|
||||
VOID
|
||||
@@ -660,22 +628,22 @@ TransferFromMemToOutBufAndSend (
|
||||
|
||||
CHAR8 *
|
||||
BasicWriteRegister (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN UINTN RegNumber,
|
||||
IN CHAR8 *InBufPtr
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN UINTN RegNumber,
|
||||
IN CHAR8 *InBufPtr
|
||||
);
|
||||
|
||||
VOID
|
||||
PrintReg (
|
||||
EFI_SYSTEM_CONTEXT SystemContext
|
||||
EFI_SYSTEM_CONTEXT SystemContext
|
||||
);
|
||||
|
||||
UINTN
|
||||
ParseBreakpointPacket (
|
||||
IN CHAR8 *PacketData,
|
||||
OUT UINTN *Type,
|
||||
OUT UINTN *Address,
|
||||
OUT UINTN *Length
|
||||
IN CHAR8 *PacketData,
|
||||
OUT UINTN *Type,
|
||||
OUT UINTN *Address,
|
||||
OUT UINTN *Length
|
||||
);
|
||||
|
||||
UINTN
|
||||
@@ -717,18 +685,18 @@ EnableDebugRegister (
|
||||
|
||||
EFI_STATUS
|
||||
FindMatchingDebugRegister (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN UINTN Address,
|
||||
IN UINTN Length,
|
||||
IN UINTN Type,
|
||||
OUT UINTN *Register
|
||||
);
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN UINTN Address,
|
||||
IN UINTN Length,
|
||||
IN UINTN Type,
|
||||
OUT UINTN *Register
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
DisableDebugRegister (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN UINTN Register
|
||||
);
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN UINTN Register
|
||||
);
|
||||
|
||||
VOID
|
||||
InitializeProcessor (
|
||||
@@ -742,8 +710,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
|
||||
);
|
||||
|
||||
#endif
|
||||
|
@@ -13,52 +13,50 @@
|
||||
// Array of exception types that need to be hooked by the debugger
|
||||
// {EFI mapping, GDB mapping}
|
||||
//
|
||||
EFI_EXCEPTION_TYPE_ENTRY gExceptionType[] = {
|
||||
{ EXCEPT_IA32_DIVIDE_ERROR, GDB_SIGFPE },
|
||||
{ EXCEPT_IA32_DEBUG, GDB_SIGTRAP },
|
||||
{ EXCEPT_IA32_NMI, GDB_SIGEMT },
|
||||
{ EXCEPT_IA32_BREAKPOINT, GDB_SIGTRAP },
|
||||
{ EXCEPT_IA32_OVERFLOW, GDB_SIGSEGV },
|
||||
{ EXCEPT_IA32_BOUND, GDB_SIGSEGV },
|
||||
{ EXCEPT_IA32_INVALID_OPCODE, GDB_SIGILL },
|
||||
{ EXCEPT_IA32_DOUBLE_FAULT, GDB_SIGEMT },
|
||||
{ EXCEPT_IA32_STACK_FAULT, GDB_SIGSEGV },
|
||||
{ EXCEPT_IA32_GP_FAULT, GDB_SIGSEGV },
|
||||
{ EXCEPT_IA32_PAGE_FAULT, GDB_SIGSEGV },
|
||||
{ EXCEPT_IA32_FP_ERROR, GDB_SIGEMT },
|
||||
{ EXCEPT_IA32_ALIGNMENT_CHECK, GDB_SIGEMT },
|
||||
{ EXCEPT_IA32_MACHINE_CHECK, GDB_SIGEMT }
|
||||
EFI_EXCEPTION_TYPE_ENTRY gExceptionType[] = {
|
||||
{ EXCEPT_IA32_DIVIDE_ERROR, GDB_SIGFPE },
|
||||
{ EXCEPT_IA32_DEBUG, GDB_SIGTRAP },
|
||||
{ EXCEPT_IA32_NMI, GDB_SIGEMT },
|
||||
{ EXCEPT_IA32_BREAKPOINT, GDB_SIGTRAP },
|
||||
{ EXCEPT_IA32_OVERFLOW, GDB_SIGSEGV },
|
||||
{ EXCEPT_IA32_BOUND, GDB_SIGSEGV },
|
||||
{ EXCEPT_IA32_INVALID_OPCODE, GDB_SIGILL },
|
||||
{ EXCEPT_IA32_DOUBLE_FAULT, GDB_SIGEMT },
|
||||
{ EXCEPT_IA32_STACK_FAULT, GDB_SIGSEGV },
|
||||
{ EXCEPT_IA32_GP_FAULT, GDB_SIGSEGV },
|
||||
{ EXCEPT_IA32_PAGE_FAULT, GDB_SIGSEGV },
|
||||
{ EXCEPT_IA32_FP_ERROR, GDB_SIGEMT },
|
||||
{ EXCEPT_IA32_ALIGNMENT_CHECK, GDB_SIGEMT },
|
||||
{ EXCEPT_IA32_MACHINE_CHECK, GDB_SIGEMT }
|
||||
};
|
||||
|
||||
|
||||
// The offsets of registers SystemContext.
|
||||
// The fields in the array are in the gdb ordering.
|
||||
//
|
||||
//16 regs
|
||||
UINTN gRegisterOffsets[] = {
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_IA32, Eax),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_IA32, Ecx),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_IA32, Edx),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_IA32, Ebx),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_IA32, Esp),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_IA32, Ebp),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_IA32, Esi),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_IA32, Edi),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_IA32, Eip),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_IA32, Eflags),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_IA32, Cs),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_IA32, Ss),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_IA32, Ds),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_IA32, Es),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_IA32, Fs),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_IA32, Gs)
|
||||
// 16 regs
|
||||
UINTN gRegisterOffsets[] = {
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_IA32, Eax),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_IA32, Ecx),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_IA32, Edx),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_IA32, Ebx),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_IA32, Esp),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_IA32, Ebp),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_IA32, Esi),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_IA32, Edi),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_IA32, Eip),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_IA32, Eflags),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_IA32, Cs),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_IA32, Ss),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_IA32, Ds),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_IA32, Es),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_IA32, Fs),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_IA32, Gs)
|
||||
};
|
||||
|
||||
|
||||
//Debug only..
|
||||
// Debug only..
|
||||
VOID
|
||||
PrintReg (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext
|
||||
)
|
||||
{
|
||||
Print ((CHAR16 *)L"EAX: %x ", SystemContext.SystemContextIa32->Eax);
|
||||
@@ -73,10 +71,10 @@ PrintReg (
|
||||
Print ((CHAR16 *)L"EFlags: %x\n", SystemContext.SystemContextIa32->Eflags);
|
||||
}
|
||||
|
||||
//Debug only..
|
||||
// Debug only..
|
||||
VOID
|
||||
PrintDRreg (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext
|
||||
)
|
||||
{
|
||||
Print ((CHAR16 *)L"DR0: %x ", SystemContext.SystemContextIa32->Dr0);
|
||||
@@ -87,7 +85,6 @@ PrintDRreg (
|
||||
Print ((CHAR16 *)L"DR7: %x\n", SystemContext.SystemContextIa32->Dr7);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Return the number of entries in the gExceptionType[]
|
||||
|
||||
@@ -101,7 +98,6 @@ MaxEfiException (
|
||||
return sizeof (gExceptionType)/sizeof (EFI_EXCEPTION_TYPE_ENTRY);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Return the number of entries in the gRegisters[]
|
||||
|
||||
@@ -115,7 +111,6 @@ MaxRegisterCount (
|
||||
return sizeof (gRegisterOffsets)/sizeof (UINTN);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Check to see if the ISA is supported.
|
||||
ISA = Instruction Set Architecture
|
||||
@@ -131,7 +126,6 @@ CheckIsa (
|
||||
return (BOOLEAN)(Isa == IsaIa32);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
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 IA32 member
|
||||
@@ -146,12 +140,12 @@ FindPointerToRegister (
|
||||
IN UINTN RegNumber
|
||||
)
|
||||
{
|
||||
UINT8 *TempPtr;
|
||||
UINT8 *TempPtr;
|
||||
|
||||
TempPtr = ((UINT8 *)SystemContext.SystemContextIa32) + gRegisterOffsets[RegNumber];
|
||||
return (UINTN *)TempPtr;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Adds the RegNumber-th register's value to the output buffer, starting at the given OutBufPtr
|
||||
|
||||
@@ -162,23 +156,23 @@ FindPointerToRegister (
|
||||
**/
|
||||
CHAR8 *
|
||||
BasicReadRegister (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN UINTN RegNumber,
|
||||
IN CHAR8 *OutBufPtr
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN UINTN RegNumber,
|
||||
IN CHAR8 *OutBufPtr
|
||||
)
|
||||
{
|
||||
UINTN RegSize;
|
||||
UINTN RegSize;
|
||||
|
||||
RegSize = 0;
|
||||
while (RegSize < REG_SIZE) {
|
||||
*OutBufPtr++ = mHexToStr[((*FindPointerToRegister (SystemContext, RegNumber) >> (RegSize+4)) & 0xf)];
|
||||
*OutBufPtr++ = mHexToStr[((*FindPointerToRegister (SystemContext, RegNumber) >> RegSize) & 0xf)];
|
||||
RegSize = RegSize + 8;
|
||||
RegSize = RegSize + 8;
|
||||
}
|
||||
|
||||
return OutBufPtr;
|
||||
}
|
||||
|
||||
|
||||
/** ‘p n’
|
||||
Reads the n-th register's value into an output buffer and sends it as a packet
|
||||
|
||||
@@ -188,17 +182,17 @@ BasicReadRegister (
|
||||
VOID
|
||||
EFIAPI
|
||||
ReadNthRegister (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN CHAR8 *InBuffer
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
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]);
|
||||
|
||||
if ((RegNumber < 0) || (RegNumber >= MaxRegisterCount())) {
|
||||
if ((RegNumber < 0) || (RegNumber >= MaxRegisterCount ())) {
|
||||
SendError (GDB_EINVALIDREGNUM);
|
||||
return;
|
||||
}
|
||||
@@ -207,10 +201,9 @@ ReadNthRegister (
|
||||
OutBufPtr = BasicReadRegister (SystemContext, RegNumber, OutBufPtr);
|
||||
|
||||
*OutBufPtr = '\0'; // the end of the buffer
|
||||
SendPacket(OutBuffer);
|
||||
SendPacket (OutBuffer);
|
||||
}
|
||||
|
||||
|
||||
/** ‘g’
|
||||
Reads the general registers into an output buffer and sends it as a packet
|
||||
|
||||
@@ -219,23 +212,23 @@ ReadNthRegister (
|
||||
VOID
|
||||
EFIAPI
|
||||
ReadGeneralRegisters (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext
|
||||
)
|
||||
{
|
||||
UINTN i;
|
||||
CHAR8 OutBuffer[129]; // 16 regs, 8 hex chars each, and the end '\0' (escape seq)
|
||||
CHAR8 *OutBufPtr; // pointer to the output buffer
|
||||
UINTN i;
|
||||
CHAR8 OutBuffer[129]; // 16 regs, 8 hex chars each, and the end '\0' (escape seq)
|
||||
CHAR8 *OutBufPtr; // pointer to the output buffer
|
||||
|
||||
OutBufPtr = OutBuffer;
|
||||
for (i = 0 ; i < MaxRegisterCount() ; i++) { // there are only 16 registers to read
|
||||
for (i = 0; i < MaxRegisterCount (); i++) {
|
||||
// there are only 16 registers to read
|
||||
OutBufPtr = BasicReadRegister (SystemContext, i, OutBufPtr);
|
||||
}
|
||||
|
||||
*OutBufPtr = '\0'; // the end of the buffer
|
||||
SendPacket(OutBuffer);
|
||||
SendPacket (OutBuffer);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Adds the RegNumber-th register's value to the output buffer, starting at the given OutBufPtr
|
||||
|
||||
@@ -246,27 +239,27 @@ ReadGeneralRegisters (
|
||||
**/
|
||||
CHAR8 *
|
||||
BasicWriteRegister (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN UINTN RegNumber,
|
||||
IN CHAR8 *InBufPtr
|
||||
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
|
||||
|
||||
NewValue = 0;
|
||||
RegSize = 0;
|
||||
RegSize = 0;
|
||||
while (RegSize < REG_SIZE) {
|
||||
TempValue = HexCharToInt(*InBufPtr++);
|
||||
TempValue = HexCharToInt (*InBufPtr++);
|
||||
|
||||
if (TempValue < 0) {
|
||||
if (TempValue < 0) {
|
||||
SendError (GDB_EBADMEMDATA);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
NewValue += (TempValue << (RegSize+4));
|
||||
TempValue = HexCharToInt(*InBufPtr++);
|
||||
TempValue = HexCharToInt (*InBufPtr++);
|
||||
|
||||
if (TempValue < 0) {
|
||||
SendError (GDB_EBADMEMDATA);
|
||||
@@ -274,13 +267,13 @@ BasicWriteRegister (
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
@@ -290,35 +283,36 @@ BasicWriteRegister (
|
||||
VOID
|
||||
EFIAPI
|
||||
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 < 0) || (RegNumber >= MaxRegisterCount())) {
|
||||
if ((RegNumber < 0) || (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
|
||||
|
||||
@@ -328,17 +322,18 @@ WriteNthRegister (
|
||||
VOID
|
||||
EFIAPI
|
||||
WriteGeneralRegisters (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN CHAR8 *InBuffer
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN CHAR8 *InBuffer
|
||||
)
|
||||
{
|
||||
UINTN i;
|
||||
CHAR8 *InBufPtr; /// pointer to the input buffer
|
||||
CHAR8 *InBufPtr; /// pointer to the input buffer
|
||||
|
||||
// check to see if the buffer is the right size which is
|
||||
// 1 (for 'G') + 16 (for 16 registers) * 8 ( for 8 hex chars each) = 129
|
||||
if (AsciiStrLen(InBuffer) != 129) { // 16 regs, 8 hex chars each, and the end '\0' (escape seq)
|
||||
//Bad message. Message is not the right length
|
||||
if (AsciiStrLen (InBuffer) != 129) {
|
||||
// 16 regs, 8 hex chars each, and the end '\0' (escape seq)
|
||||
// Bad message. Message is not the right length
|
||||
SendError (GDB_EBADBUFSIZE);
|
||||
return;
|
||||
}
|
||||
@@ -347,14 +342,14 @@ WriteGeneralRegisters (
|
||||
|
||||
// Read the new values for the registers from the input buffer to an array, NewValueArray.
|
||||
// The values in the array are in the gdb ordering
|
||||
for (i=0; i < MaxRegisterCount(); i++) { // there are only 16 registers to write
|
||||
for (i = 0; i < MaxRegisterCount (); i++) {
|
||||
// there are only 16 registers to write
|
||||
InBufPtr = BasicWriteRegister (SystemContext, i, InBufPtr);
|
||||
}
|
||||
|
||||
SendSuccess();
|
||||
SendSuccess ();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Insert Single Step in the SystemContext
|
||||
|
||||
@@ -365,10 +360,9 @@ AddSingleStep (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext
|
||||
)
|
||||
{
|
||||
SystemContext.SystemContextIa32->Eflags |= TF_BIT; //Setting the TF bit.
|
||||
SystemContext.SystemContextIa32->Eflags |= TF_BIT; // Setting the TF bit.
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Remove Single Step in the SystemContext
|
||||
|
||||
@@ -382,8 +376,6 @@ RemoveSingleStep (
|
||||
SystemContext.SystemContextIa32->Eflags &= ~TF_BIT; // clearing the TF bit.
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** ‘c [addr ]’
|
||||
Continue. addr is Address to resume. If addr is omitted, resume at current
|
||||
Address.
|
||||
@@ -393,8 +385,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') {
|
||||
@@ -402,7 +394,6 @@ ContinueAtAddress (
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/** ‘s [addr ]’
|
||||
Single step. addr is the Address at which to resume. If addr is omitted, resume
|
||||
at same Address.
|
||||
@@ -412,8 +403,8 @@ ContinueAtAddress (
|
||||
VOID
|
||||
EFIAPI
|
||||
SingleStep (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN CHAR8 *PacketData
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN CHAR8 *PacketData
|
||||
)
|
||||
{
|
||||
if (PacketData[1] != '\0') {
|
||||
@@ -423,7 +414,6 @@ SingleStep (
|
||||
AddSingleStep (SystemContext);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Returns breakpoint data address from DR0-DR3 based on the input breakpoint number
|
||||
|
||||
@@ -439,7 +429,7 @@ GetBreakpointDataAddress (
|
||||
IN UINTN BreakpointNumber
|
||||
)
|
||||
{
|
||||
UINTN Address;
|
||||
UINTN Address;
|
||||
|
||||
if (BreakpointNumber == 1) {
|
||||
Address = SystemContext.SystemContextIa32->Dr0;
|
||||
@@ -456,7 +446,6 @@ GetBreakpointDataAddress (
|
||||
return Address;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Returns currently detected breakpoint value based on the register DR6 B0-B3 field.
|
||||
If no breakpoint is detected then it returns 0.
|
||||
@@ -472,8 +461,8 @@ GetBreakpointDetected (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext
|
||||
)
|
||||
{
|
||||
IA32_DR6 Dr6;
|
||||
UINTN BreakpointNumber;
|
||||
IA32_DR6 Dr6;
|
||||
UINTN BreakpointNumber;
|
||||
|
||||
Dr6.UintN = SystemContext.SystemContextIa32->Dr6;
|
||||
|
||||
@@ -486,13 +475,12 @@ GetBreakpointDetected (
|
||||
} else if (Dr6.Bits.B3 == 1) {
|
||||
BreakpointNumber = 4;
|
||||
} else {
|
||||
BreakpointNumber = 0; //No breakpoint detected
|
||||
BreakpointNumber = 0; // No breakpoint detected
|
||||
}
|
||||
|
||||
return BreakpointNumber;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Returns Breakpoint type (InstructionExecution, DataWrite, DataRead or DataReadWrite)
|
||||
based on the Breakpoint number
|
||||
@@ -510,25 +498,24 @@ GetBreakpointType (
|
||||
IN UINTN BreakpointNumber
|
||||
)
|
||||
{
|
||||
IA32_DR7 Dr7;
|
||||
BREAK_TYPE Type = NotSupported; //Default is NotSupported type
|
||||
IA32_DR7 Dr7;
|
||||
BREAK_TYPE Type = NotSupported; // Default is NotSupported type
|
||||
|
||||
Dr7.UintN = SystemContext.SystemContextIa32->Dr7;
|
||||
|
||||
if (BreakpointNumber == 1) {
|
||||
Type = (BREAK_TYPE) Dr7.Bits.RW0;
|
||||
Type = (BREAK_TYPE)Dr7.Bits.RW0;
|
||||
} else if (BreakpointNumber == 2) {
|
||||
Type = (BREAK_TYPE) Dr7.Bits.RW1;
|
||||
Type = (BREAK_TYPE)Dr7.Bits.RW1;
|
||||
} else if (BreakpointNumber == 3) {
|
||||
Type = (BREAK_TYPE) Dr7.Bits.RW2;
|
||||
Type = (BREAK_TYPE)Dr7.Bits.RW2;
|
||||
} else if (BreakpointNumber == 4) {
|
||||
Type = (BREAK_TYPE) Dr7.Bits.RW3;
|
||||
Type = (BREAK_TYPE)Dr7.Bits.RW3;
|
||||
}
|
||||
|
||||
return Type;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Parses Length and returns the length which DR7 LENn field accepts.
|
||||
For example: If we receive 1-Byte length then we should return 0.
|
||||
@@ -541,21 +528,24 @@ GetBreakpointType (
|
||||
**/
|
||||
UINTN
|
||||
ConvertLengthData (
|
||||
IN UINTN Length
|
||||
IN UINTN Length
|
||||
)
|
||||
{
|
||||
if (Length == 1) { //1-Byte length
|
||||
if (Length == 1) {
|
||||
// 1-Byte length
|
||||
return 0;
|
||||
} else if (Length == 2) { //2-Byte length
|
||||
} else if (Length == 2) {
|
||||
// 2-Byte length
|
||||
return 1;
|
||||
} else if (Length == 4) { //4-Byte length
|
||||
} else if (Length == 4) {
|
||||
// 4-Byte length
|
||||
return 3;
|
||||
} else { //Undefined or 8-byte length
|
||||
} else {
|
||||
// Undefined or 8-byte length
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Finds the next free debug register. If all the registers are occupied then
|
||||
EFI_OUT_OF_RESOURCES is returned.
|
||||
@@ -572,7 +562,7 @@ FindNextFreeDebugRegister (
|
||||
OUT UINTN *Register
|
||||
)
|
||||
{
|
||||
IA32_DR7 Dr7;
|
||||
IA32_DR7 Dr7;
|
||||
|
||||
Dr7.UintN = SystemContext.SystemContextIa32->Dr7;
|
||||
|
||||
@@ -591,7 +581,6 @@ FindNextFreeDebugRegister (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Enables the debug register. Writes Address value to appropriate DR0-3 register.
|
||||
Sets LENn, Gn, RWn bits in DR7 register.
|
||||
@@ -616,56 +605,56 @@ EnableDebugRegister (
|
||||
{
|
||||
IA32_DR7 Dr7;
|
||||
|
||||
//Convert length data
|
||||
// Convert length data
|
||||
Length = ConvertLengthData (Length);
|
||||
|
||||
//For Instruction execution, length should be 0
|
||||
//(Ref. Intel reference manual 18.2.4)
|
||||
// For Instruction execution, length should be 0
|
||||
// (Ref. Intel reference manual 18.2.4)
|
||||
if ((Type == 0) && (Length != 0)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
//Hardware doesn't support ReadWatch (z3 packet) type. GDB can handle
|
||||
//software breakpoint. We should send empty packet in both these cases.
|
||||
// Hardware doesn't support ReadWatch (z3 packet) type. GDB can handle
|
||||
// software breakpoint. We should send empty packet in both these cases.
|
||||
if ((Type == (BREAK_TYPE)DataRead) ||
|
||||
(Type == (BREAK_TYPE)SoftwareBreakpoint)) {
|
||||
(Type == (BREAK_TYPE)SoftwareBreakpoint))
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
//Read DR7 so appropriate Gn, RWn and LENn bits can be modified.
|
||||
// Read DR7 so appropriate Gn, RWn and LENn bits can be modified.
|
||||
Dr7.UintN = SystemContext.SystemContextIa32->Dr7;
|
||||
|
||||
if (Register == 0) {
|
||||
SystemContext.SystemContextIa32->Dr0 = Address;
|
||||
Dr7.Bits.G0 = 1;
|
||||
Dr7.Bits.RW0 = Type;
|
||||
Dr7.Bits.LEN0 = Length;
|
||||
Dr7.Bits.G0 = 1;
|
||||
Dr7.Bits.RW0 = Type;
|
||||
Dr7.Bits.LEN0 = Length;
|
||||
} else if (Register == 1) {
|
||||
SystemContext.SystemContextIa32->Dr1 = Address;
|
||||
Dr7.Bits.G1 = 1;
|
||||
Dr7.Bits.RW1 = Type;
|
||||
Dr7.Bits.LEN1 = Length;
|
||||
Dr7.Bits.G1 = 1;
|
||||
Dr7.Bits.RW1 = Type;
|
||||
Dr7.Bits.LEN1 = Length;
|
||||
} else if (Register == 2) {
|
||||
SystemContext.SystemContextIa32->Dr2 = Address;
|
||||
Dr7.Bits.G2 = 1;
|
||||
Dr7.Bits.RW2 = Type;
|
||||
Dr7.Bits.LEN2 = Length;
|
||||
Dr7.Bits.G2 = 1;
|
||||
Dr7.Bits.RW2 = Type;
|
||||
Dr7.Bits.LEN2 = Length;
|
||||
} else if (Register == 3) {
|
||||
SystemContext.SystemContextIa32->Dr3 = Address;
|
||||
Dr7.Bits.G3 = 1;
|
||||
Dr7.Bits.RW3 = Type;
|
||||
Dr7.Bits.LEN3 = Length;
|
||||
Dr7.Bits.G3 = 1;
|
||||
Dr7.Bits.RW3 = Type;
|
||||
Dr7.Bits.LEN3 = Length;
|
||||
} else {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
//Update Dr7 with appropriate Gn, RWn and LENn bits
|
||||
// Update Dr7 with appropriate Gn, RWn and LENn bits
|
||||
SystemContext.SystemContextIa32->Dr7 = Dr7.UintN;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Returns register number 0 - 3 for the matching debug register.
|
||||
This function compares incoming Address, Type, Length and
|
||||
@@ -684,46 +673,51 @@ EnableDebugRegister (
|
||||
**/
|
||||
EFI_STATUS
|
||||
FindMatchingDebugRegister (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN UINTN Address,
|
||||
IN UINTN Length,
|
||||
IN UINTN Type,
|
||||
OUT UINTN *Register
|
||||
)
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN UINTN Address,
|
||||
IN UINTN Length,
|
||||
IN UINTN Type,
|
||||
OUT UINTN *Register
|
||||
)
|
||||
{
|
||||
IA32_DR7 Dr7;
|
||||
IA32_DR7 Dr7;
|
||||
|
||||
//Hardware doesn't support ReadWatch (z3 packet) type. GDB can handle
|
||||
//software breakpoint. We should send empty packet in both these cases.
|
||||
// Hardware doesn't support ReadWatch (z3 packet) type. GDB can handle
|
||||
// software breakpoint. We should send empty packet in both these cases.
|
||||
if ((Type == (BREAK_TYPE)DataRead) ||
|
||||
(Type == (BREAK_TYPE)SoftwareBreakpoint)) {
|
||||
(Type == (BREAK_TYPE)SoftwareBreakpoint))
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
//Convert length data
|
||||
Length = ConvertLengthData(Length);
|
||||
// Convert length data
|
||||
Length = ConvertLengthData (Length);
|
||||
|
||||
Dr7.UintN = SystemContext.SystemContextIa32->Dr7;
|
||||
|
||||
if ((Dr7.Bits.G0 == 1) &&
|
||||
(Dr7.Bits.LEN0 == Length) &&
|
||||
(Dr7.Bits.RW0 == Type) &&
|
||||
(Address == SystemContext.SystemContextIa32->Dr0)) {
|
||||
(Address == SystemContext.SystemContextIa32->Dr0))
|
||||
{
|
||||
*Register = 0;
|
||||
} else if ((Dr7.Bits.G1 == 1) &&
|
||||
(Dr7.Bits.LEN1 == Length) &&
|
||||
(Dr7.Bits.RW1 == Type) &&
|
||||
(Address == SystemContext.SystemContextIa32->Dr1)) {
|
||||
(Address == SystemContext.SystemContextIa32->Dr1))
|
||||
{
|
||||
*Register = 1;
|
||||
} else if ((Dr7.Bits.G2 == 1) &&
|
||||
(Dr7.Bits.LEN2 == Length) &&
|
||||
(Dr7.Bits.RW2 == Type) &&
|
||||
(Address == SystemContext.SystemContextIa32->Dr2)) {
|
||||
(Address == SystemContext.SystemContextIa32->Dr2))
|
||||
{
|
||||
*Register = 2;
|
||||
} else if ((Dr7.Bits.G3 == 1) &&
|
||||
(Dr7.Bits.LEN3 == Length) &&
|
||||
(Dr7.Bits.RW3 == Type) &&
|
||||
(Address == SystemContext.SystemContextIa32->Dr3)) {
|
||||
(Address == SystemContext.SystemContextIa32->Dr3))
|
||||
{
|
||||
*Register = 3;
|
||||
} else {
|
||||
Print ((CHAR16 *)L"No match found..\n");
|
||||
@@ -733,7 +727,6 @@ FindMatchingDebugRegister (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Disables the particular debug register.
|
||||
|
||||
@@ -745,47 +738,46 @@ FindMatchingDebugRegister (
|
||||
**/
|
||||
EFI_STATUS
|
||||
DisableDebugRegister (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN UINTN Register
|
||||
)
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN UINTN Register
|
||||
)
|
||||
{
|
||||
IA32_DR7 Dr7;
|
||||
UINTN Address = 0;
|
||||
UINTN Address = 0;
|
||||
|
||||
//Read DR7 register so appropriate Gn, RWn and LENn bits can be turned off.
|
||||
// Read DR7 register so appropriate Gn, RWn and LENn bits can be turned off.
|
||||
Dr7.UintN = SystemContext.SystemContextIa32->Dr7;
|
||||
|
||||
if (Register == 0) {
|
||||
SystemContext.SystemContextIa32->Dr0 = Address;
|
||||
Dr7.Bits.G0 = 0;
|
||||
Dr7.Bits.RW0 = 0;
|
||||
Dr7.Bits.LEN0 = 0;
|
||||
Dr7.Bits.G0 = 0;
|
||||
Dr7.Bits.RW0 = 0;
|
||||
Dr7.Bits.LEN0 = 0;
|
||||
} else if (Register == 1) {
|
||||
SystemContext.SystemContextIa32->Dr1 = Address;
|
||||
Dr7.Bits.G1 = 0;
|
||||
Dr7.Bits.RW1 = 0;
|
||||
Dr7.Bits.LEN1 = 0;
|
||||
Dr7.Bits.G1 = 0;
|
||||
Dr7.Bits.RW1 = 0;
|
||||
Dr7.Bits.LEN1 = 0;
|
||||
} else if (Register == 2) {
|
||||
SystemContext.SystemContextIa32->Dr2 = Address;
|
||||
Dr7.Bits.G2 = 0;
|
||||
Dr7.Bits.RW2 = 0;
|
||||
Dr7.Bits.LEN2 = 0;
|
||||
Dr7.Bits.G2 = 0;
|
||||
Dr7.Bits.RW2 = 0;
|
||||
Dr7.Bits.LEN2 = 0;
|
||||
} else if (Register == 3) {
|
||||
SystemContext.SystemContextIa32->Dr3 = Address;
|
||||
Dr7.Bits.G3 = 0;
|
||||
Dr7.Bits.RW3 = 0;
|
||||
Dr7.Bits.LEN3 = 0;
|
||||
Dr7.Bits.G3 = 0;
|
||||
Dr7.Bits.RW3 = 0;
|
||||
Dr7.Bits.LEN3 = 0;
|
||||
} else {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
//Update DR7 register so appropriate Gn, RWn and LENn bits can be turned off.
|
||||
// Update DR7 register so appropriate Gn, RWn and LENn bits can be turned off.
|
||||
SystemContext.SystemContextIa32->Dr7 = Dr7.UintN;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
‘Z1, [addr], [length]’
|
||||
‘Z2, [addr], [length]’
|
||||
@@ -802,16 +794,16 @@ VOID
|
||||
EFIAPI
|
||||
InsertBreakPoint (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN CHAR8 *PacketData
|
||||
IN CHAR8 *PacketData
|
||||
)
|
||||
{
|
||||
UINTN Type;
|
||||
UINTN Address;
|
||||
UINTN Length;
|
||||
UINTN Register;
|
||||
EFI_STATUS Status;
|
||||
BREAK_TYPE BreakType = NotSupported;
|
||||
UINTN ErrorCode;
|
||||
UINTN Type;
|
||||
UINTN Address;
|
||||
UINTN Length;
|
||||
UINTN Register;
|
||||
EFI_STATUS Status;
|
||||
BREAK_TYPE BreakType = NotSupported;
|
||||
UINTN ErrorCode;
|
||||
|
||||
ErrorCode = ParseBreakpointPacket (PacketData, &Type, &Address, &Length);
|
||||
if (ErrorCode > 0) {
|
||||
@@ -820,28 +812,27 @@ InsertBreakPoint (
|
||||
}
|
||||
|
||||
switch (Type) {
|
||||
|
||||
case 0: //Software breakpoint
|
||||
case 0: // Software breakpoint
|
||||
BreakType = SoftwareBreakpoint;
|
||||
break;
|
||||
|
||||
case 1: //Hardware breakpoint
|
||||
case 1: // Hardware breakpoint
|
||||
BreakType = InstructionExecution;
|
||||
break;
|
||||
|
||||
case 2: //Write watchpoint
|
||||
case 2: // Write watchpoint
|
||||
BreakType = DataWrite;
|
||||
break;
|
||||
|
||||
case 3: //Read watchpoint
|
||||
case 3: // Read watchpoint
|
||||
BreakType = DataRead;
|
||||
break;
|
||||
|
||||
case 4: //Access watchpoint
|
||||
case 4: // Access watchpoint
|
||||
BreakType = DataReadWrite;
|
||||
break;
|
||||
|
||||
default :
|
||||
default:
|
||||
Print ((CHAR16 *)L"Insert breakpoint default: %x\n", Type);
|
||||
SendError (GDB_EINVALIDBRKPOINTTYPE);
|
||||
return;
|
||||
@@ -849,7 +840,7 @@ InsertBreakPoint (
|
||||
|
||||
// Find next free debug register
|
||||
Status = FindNextFreeDebugRegister (SystemContext, &Register);
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print ((CHAR16 *)L"No space left on device\n");
|
||||
SendError (GDB_ENOSPACE);
|
||||
return;
|
||||
@@ -857,8 +848,7 @@ InsertBreakPoint (
|
||||
|
||||
// Write Address, length data at particular DR register
|
||||
Status = EnableDebugRegister (SystemContext, Register, Address, Length, (UINTN)BreakType);
|
||||
if (EFI_ERROR(Status)) {
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
if (Status == EFI_UNSUPPORTED) {
|
||||
Print ((CHAR16 *)L"Not supported\n");
|
||||
SendNotSupported ();
|
||||
@@ -873,7 +863,6 @@ InsertBreakPoint (
|
||||
SendSuccess ();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
‘z1, [addr], [length]’
|
||||
‘z2, [addr], [length]’
|
||||
@@ -892,15 +881,15 @@ RemoveBreakPoint (
|
||||
IN CHAR8 *PacketData
|
||||
)
|
||||
{
|
||||
UINTN Type;
|
||||
UINTN Address;
|
||||
UINTN Length;
|
||||
UINTN Register;
|
||||
BREAK_TYPE BreakType = NotSupported;
|
||||
EFI_STATUS Status;
|
||||
UINTN ErrorCode;
|
||||
UINTN Type;
|
||||
UINTN Address;
|
||||
UINTN Length;
|
||||
UINTN Register;
|
||||
BREAK_TYPE BreakType = NotSupported;
|
||||
EFI_STATUS Status;
|
||||
UINTN ErrorCode;
|
||||
|
||||
//Parse breakpoint packet data
|
||||
// Parse breakpoint packet data
|
||||
ErrorCode = ParseBreakpointPacket (PacketData, &Type, &Address, &Length);
|
||||
if (ErrorCode > 0) {
|
||||
SendError ((UINT8)ErrorCode);
|
||||
@@ -908,36 +897,34 @@ RemoveBreakPoint (
|
||||
}
|
||||
|
||||
switch (Type) {
|
||||
|
||||
case 0: //Software breakpoint
|
||||
case 0: // Software breakpoint
|
||||
BreakType = SoftwareBreakpoint;
|
||||
break;
|
||||
|
||||
case 1: //Hardware breakpoint
|
||||
case 1: // Hardware breakpoint
|
||||
BreakType = InstructionExecution;
|
||||
break;
|
||||
|
||||
case 2: //Write watchpoint
|
||||
case 2: // Write watchpoint
|
||||
BreakType = DataWrite;
|
||||
break;
|
||||
|
||||
case 3: //Read watchpoint
|
||||
case 3: // Read watchpoint
|
||||
BreakType = DataRead;
|
||||
break;
|
||||
|
||||
case 4: //Access watchpoint
|
||||
case 4: // Access watchpoint
|
||||
BreakType = DataReadWrite;
|
||||
break;
|
||||
|
||||
default :
|
||||
default:
|
||||
SendError (GDB_EINVALIDBRKPOINTTYPE);
|
||||
return;
|
||||
}
|
||||
|
||||
//Find matching debug register
|
||||
// Find matching debug register
|
||||
Status = FindMatchingDebugRegister (SystemContext, Address, Length, (UINTN)BreakType, &Register);
|
||||
if (EFI_ERROR(Status)) {
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
if (Status == EFI_UNSUPPORTED) {
|
||||
Print ((CHAR16 *)L"Not supported.\n");
|
||||
SendNotSupported ();
|
||||
@@ -949,9 +936,9 @@ RemoveBreakPoint (
|
||||
return;
|
||||
}
|
||||
|
||||
//Remove breakpoint
|
||||
// Remove breakpoint
|
||||
Status = DisableDebugRegister (SystemContext, Register);
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print ((CHAR16 *)L"Invalid argument.\n");
|
||||
SendError (GDB_EINVALIDARG);
|
||||
return;
|
||||
@@ -960,7 +947,6 @@ RemoveBreakPoint (
|
||||
SendSuccess ();
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
InitializeProcessor (
|
||||
VOID
|
||||
@@ -978,10 +964,9 @@ 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
|
||||
)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@@ -18,14 +18,14 @@
|
||||
// Set TRUE if F Reply package signals a ctrl-c. We can not process the Ctrl-c
|
||||
// here we need to wait for the periodic callback to do this.
|
||||
//
|
||||
BOOLEAN gCtrlCBreakFlag = FALSE;
|
||||
BOOLEAN gCtrlCBreakFlag = FALSE;
|
||||
|
||||
//
|
||||
// If the periodic callback is called while we are processing an F packet we need
|
||||
// to let the callback know to not read from the serial stream as it could steal
|
||||
// characters from the F response packet
|
||||
//
|
||||
BOOLEAN gProcessingFPacket = FALSE;
|
||||
BOOLEAN gProcessingFPacket = FALSE;
|
||||
|
||||
/**
|
||||
Process a control-C break message.
|
||||
@@ -35,21 +35,19 @@ BOOLEAN gProcessingFPacket = FALSE;
|
||||
@param ErrNo Error information from the F reply packet or other source
|
||||
|
||||
**/
|
||||
|
||||
VOID
|
||||
GdbCtrlCBreakMessage (
|
||||
IN UINTN ErrNo
|
||||
IN UINTN ErrNo
|
||||
)
|
||||
{
|
||||
// See D.10.5 of gdb.pdf
|
||||
// This should look like a break message. Should look like SIGINT
|
||||
|
||||
/* TODO: Make sure if we should do anything with ErrNo */
|
||||
//Turn on the global Ctrl-C flag.
|
||||
// Turn on the global Ctrl-C flag.
|
||||
gCtrlCBreakFlag = TRUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Parse the F reply packet and extract the return value and an ErrNo if it exists.
|
||||
|
||||
@@ -62,11 +60,11 @@ GdbCtrlCBreakMessage (
|
||||
**/
|
||||
INTN
|
||||
GdbParseFReplyPacket (
|
||||
IN CHAR8 *Packet,
|
||||
OUT UINTN *ErrNo
|
||||
IN CHAR8 *Packet,
|
||||
OUT UINTN *ErrNo
|
||||
)
|
||||
{
|
||||
INTN RetCode;
|
||||
INTN RetCode;
|
||||
|
||||
if (Packet[0] != 'F') {
|
||||
// A valid response would be an F packet
|
||||
@@ -76,7 +74,9 @@ GdbParseFReplyPacket (
|
||||
RetCode = AsciiStrHexToUintn (&Packet[1]);
|
||||
|
||||
// Find 1st comma
|
||||
for (;*Packet != '\0' && *Packet != ','; Packet++);
|
||||
for ( ; *Packet != '\0' && *Packet != ','; Packet++) {
|
||||
}
|
||||
|
||||
if (*Packet == '\0') {
|
||||
*ErrNo = 0;
|
||||
return RetCode;
|
||||
@@ -85,7 +85,9 @@ GdbParseFReplyPacket (
|
||||
*ErrNo = AsciiStrHexToUintn (++Packet);
|
||||
|
||||
// Find 2nd comma
|
||||
for (;*Packet != '\0' && *Packet != ','; Packet++);
|
||||
for ( ; *Packet != '\0' && *Packet != ','; Packet++) {
|
||||
}
|
||||
|
||||
if (*Packet == '\0') {
|
||||
return RetCode;
|
||||
}
|
||||
@@ -97,7 +99,6 @@ GdbParseFReplyPacket (
|
||||
return RetCode;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Read data from a FileDescriptor. On success number of bytes read is returned. Zero indicates
|
||||
the end of a file. On error -1 is returned. If count is zero, GdbRead returns zero.
|
||||
@@ -112,16 +113,16 @@ GdbParseFReplyPacket (
|
||||
**/
|
||||
INTN
|
||||
GdbRead (
|
||||
IN INTN FileDescriptor,
|
||||
OUT VOID *Buffer,
|
||||
IN UINTN Count
|
||||
IN INTN FileDescriptor,
|
||||
OUT VOID *Buffer,
|
||||
IN UINTN Count
|
||||
)
|
||||
{
|
||||
CHAR8 Packet[128];
|
||||
UINTN Size;
|
||||
INTN RetCode;
|
||||
UINTN ErrNo;
|
||||
BOOLEAN ReceiveDone = FALSE;
|
||||
CHAR8 Packet[128];
|
||||
UINTN Size;
|
||||
INTN RetCode;
|
||||
UINTN ErrNo;
|
||||
BOOLEAN ReceiveDone = FALSE;
|
||||
|
||||
// Send:
|
||||
// "Fread,XX,YYYYYYYY,XX
|
||||
@@ -146,23 +147,23 @@ GdbRead (
|
||||
|
||||
// Process GDB commands
|
||||
switch (Packet[0]) {
|
||||
//Write memory command.
|
||||
//M addr,length:XX...
|
||||
// Write memory command.
|
||||
// M addr,length:XX...
|
||||
case 'M':
|
||||
WriteToMemory (Packet);
|
||||
break;
|
||||
|
||||
//Fretcode, errno, Ctrl-C flag
|
||||
//retcode - Count read
|
||||
// Fretcode, errno, Ctrl-C flag
|
||||
// retcode - Count read
|
||||
case 'F':
|
||||
//Once target receives F reply packet that means the previous
|
||||
//transactions are finished.
|
||||
// Once target receives F reply packet that means the previous
|
||||
// transactions are finished.
|
||||
ReceiveDone = TRUE;
|
||||
break;
|
||||
|
||||
//Send empty buffer
|
||||
default :
|
||||
SendNotSupported();
|
||||
// Send empty buffer
|
||||
default:
|
||||
SendNotSupported ();
|
||||
break;
|
||||
}
|
||||
} while (ReceiveDone == FALSE);
|
||||
@@ -171,7 +172,7 @@ GdbRead (
|
||||
Print ((CHAR16 *)L"RetCode: %x..ErrNo: %x..\n", RetCode, ErrNo);
|
||||
|
||||
if (ErrNo > 0) {
|
||||
//Send error to the host if there is any.
|
||||
// Send error to the host if there is any.
|
||||
SendError ((UINT8)ErrNo);
|
||||
}
|
||||
|
||||
@@ -180,7 +181,6 @@ GdbRead (
|
||||
return RetCode;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Write data to a FileDescriptor. On success number of bytes written is returned. Zero indicates
|
||||
nothing was written. On error -1 is returned.
|
||||
@@ -195,16 +195,16 @@ GdbRead (
|
||||
**/
|
||||
INTN
|
||||
GdbWrite (
|
||||
IN INTN FileDescriptor,
|
||||
OUT CONST VOID *Buffer,
|
||||
IN UINTN Count
|
||||
IN INTN FileDescriptor,
|
||||
OUT CONST VOID *Buffer,
|
||||
IN UINTN Count
|
||||
)
|
||||
{
|
||||
CHAR8 Packet[128];
|
||||
UINTN Size;
|
||||
INTN RetCode;
|
||||
UINTN ErrNo;
|
||||
BOOLEAN ReceiveDone = FALSE;
|
||||
CHAR8 Packet[128];
|
||||
UINTN Size;
|
||||
INTN RetCode;
|
||||
UINTN ErrNo;
|
||||
BOOLEAN ReceiveDone = FALSE;
|
||||
|
||||
// Send:
|
||||
// #Fwrite,XX,YYYYYYYY,XX$SS
|
||||
@@ -228,23 +228,23 @@ GdbWrite (
|
||||
|
||||
// Process GDB commands
|
||||
switch (Packet[0]) {
|
||||
//Read memory command.
|
||||
//m addr,length.
|
||||
// Read memory command.
|
||||
// m addr,length.
|
||||
case 'm':
|
||||
ReadFromMemory (Packet);
|
||||
break;
|
||||
|
||||
//Fretcode, errno, Ctrl-C flag
|
||||
//retcode - Count read
|
||||
// Fretcode, errno, Ctrl-C flag
|
||||
// retcode - Count read
|
||||
case 'F':
|
||||
//Once target receives F reply packet that means the previous
|
||||
//transactions are finished.
|
||||
// Once target receives F reply packet that means the previous
|
||||
// transactions are finished.
|
||||
ReceiveDone = TRUE;
|
||||
break;
|
||||
|
||||
//Send empty buffer
|
||||
default :
|
||||
SendNotSupported();
|
||||
// Send empty buffer
|
||||
default:
|
||||
SendNotSupported ();
|
||||
break;
|
||||
}
|
||||
} while (ReceiveDone == FALSE);
|
||||
@@ -252,15 +252,14 @@ GdbWrite (
|
||||
RetCode = GdbParseFReplyPacket (Packet, &ErrNo);
|
||||
Print ((CHAR16 *)L"RetCode: %x..ErrNo: %x..\n", RetCode, ErrNo);
|
||||
|
||||
//Send error to the host if there is any.
|
||||
// Send error to the host if there is any.
|
||||
if (ErrNo > 0) {
|
||||
SendError((UINT8)ErrNo);
|
||||
SendError ((UINT8)ErrNo);
|
||||
}
|
||||
|
||||
return RetCode;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Reset the serial device.
|
||||
|
||||
@@ -279,7 +278,6 @@ GdbSerialReset (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Sets the baud rate, receive FIFO depth, transmit/receive time out, parity,
|
||||
data buts, and stop bits on a serial device.
|
||||
@@ -321,7 +319,6 @@ GdbSerialSetAttributes (
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Set the control bits on a serial device
|
||||
|
||||
@@ -343,7 +340,6 @@ GdbSerialSetControl (
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Retrieves the status of the control bits on a serial device
|
||||
|
||||
@@ -364,7 +360,6 @@ GdbSerialGetControl (
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Writes data to a serial device.
|
||||
|
||||
@@ -387,7 +382,7 @@ GdbSerialWrite (
|
||||
)
|
||||
{
|
||||
GDB_SERIAL_DEV *SerialDev;
|
||||
UINTN Return;
|
||||
UINTN Return;
|
||||
|
||||
SerialDev = GDB_SERIAL_DEV_FROM_THIS (This);
|
||||
|
||||
@@ -416,7 +411,6 @@ GdbSerialWrite (
|
||||
@retval EFI_TIMEOUT The data write was stopped due to a timeout.
|
||||
|
||||
**/
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GdbSerialRead (
|
||||
@@ -426,7 +420,7 @@ GdbSerialRead (
|
||||
)
|
||||
{
|
||||
GDB_SERIAL_DEV *SerialDev;
|
||||
UINTN Return;
|
||||
UINTN Return;
|
||||
|
||||
SerialDev = GDB_SERIAL_DEV_FROM_THIS (This);
|
||||
|
||||
@@ -442,11 +436,10 @@ GdbSerialRead (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Template used to initialize the GDB Serial IO protocols
|
||||
//
|
||||
GDB_SERIAL_DEV gdbSerialDevTemplate = {
|
||||
GDB_SERIAL_DEV gdbSerialDevTemplate = {
|
||||
GDB_SERIAL_DEV_SIGNATURE,
|
||||
NULL,
|
||||
|
||||
@@ -460,14 +453,14 @@ GDB_SERIAL_DEV gdbSerialDevTemplate = {
|
||||
GdbSerialRead,
|
||||
NULL
|
||||
},
|
||||
{ // SerialMode
|
||||
0, // ControlMask
|
||||
0, // Timeout
|
||||
0, // BaudRate
|
||||
1, // RceiveFifoDepth
|
||||
0, // DataBits
|
||||
0, // Parity
|
||||
0 // StopBits
|
||||
{ // SerialMode
|
||||
0, // ControlMask
|
||||
0, // Timeout
|
||||
0, // BaudRate
|
||||
1, // RceiveFifoDepth
|
||||
0, // DataBits
|
||||
0, // Parity
|
||||
0 // StopBits
|
||||
},
|
||||
{
|
||||
{
|
||||
@@ -475,8 +468,8 @@ GDB_SERIAL_DEV gdbSerialDevTemplate = {
|
||||
HARDWARE_DEVICE_PATH,
|
||||
HW_VENDOR_DP,
|
||||
{
|
||||
(UINT8) (sizeof (VENDOR_DEVICE_PATH) + sizeof (UINT32)),
|
||||
(UINT8) ((sizeof (VENDOR_DEVICE_PATH) + sizeof (UINT32)) >> 8)
|
||||
(UINT8)(sizeof (VENDOR_DEVICE_PATH) + sizeof (UINT32)),
|
||||
(UINT8)((sizeof (VENDOR_DEVICE_PATH) + sizeof (UINT32)) >> 8)
|
||||
},
|
||||
},
|
||||
EFI_SERIAL_IO_PROTOCOL_GUID
|
||||
@@ -486,8 +479,8 @@ GDB_SERIAL_DEV gdbSerialDevTemplate = {
|
||||
END_DEVICE_PATH_TYPE,
|
||||
END_ENTIRE_DEVICE_PATH_SUBTYPE,
|
||||
{
|
||||
(UINT8) (sizeof (EFI_DEVICE_PATH_PROTOCOL)),
|
||||
(UINT8) (sizeof (EFI_DEVICE_PATH_PROTOCOL) >> 8)
|
||||
(UINT8)(sizeof (EFI_DEVICE_PATH_PROTOCOL)),
|
||||
(UINT8)(sizeof (EFI_DEVICE_PATH_PROTOCOL) >> 8)
|
||||
}
|
||||
},
|
||||
},
|
||||
@@ -495,7 +488,6 @@ GDB_SERIAL_DEV gdbSerialDevTemplate = {
|
||||
GDB_STDOUT
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
Make two serial consoles: 1) StdIn and StdOut via GDB. 2) StdErr via GDB.
|
||||
|
||||
@@ -512,25 +504,27 @@ GdbInitializeSerialConsole (
|
||||
GDB_SERIAL_DEV *StdErrSerialDev;
|
||||
|
||||
// Use the template to make a copy of the Serial Console private data structure.
|
||||
StdOutSerialDev = AllocateCopyPool (sizeof (GDB_SERIAL_DEV), &gdbSerialDevTemplate);
|
||||
StdOutSerialDev = AllocateCopyPool (sizeof (GDB_SERIAL_DEV), &gdbSerialDevTemplate);
|
||||
ASSERT (StdOutSerialDev != NULL);
|
||||
|
||||
// Fixup pointer after the copy
|
||||
StdOutSerialDev->SerialIo.Mode = &StdOutSerialDev->SerialMode;
|
||||
|
||||
StdErrSerialDev = AllocateCopyPool (sizeof (GDB_SERIAL_DEV), &gdbSerialDevTemplate);
|
||||
StdErrSerialDev = AllocateCopyPool (sizeof (GDB_SERIAL_DEV), &gdbSerialDevTemplate);
|
||||
ASSERT (StdErrSerialDev != NULL);
|
||||
|
||||
// Fixup pointer and modify stuff that is different for StdError
|
||||
StdErrSerialDev->SerialIo.Mode = &StdErrSerialDev->SerialMode;
|
||||
StdErrSerialDev->DevicePath.Index = 1;
|
||||
StdErrSerialDev->SerialIo.Mode = &StdErrSerialDev->SerialMode;
|
||||
StdErrSerialDev->DevicePath.Index = 1;
|
||||
StdErrSerialDev->OutFileDescriptor = GDB_STDERR;
|
||||
|
||||
// Make a new handle with Serial IO protocol and its device path on it.
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||
&StdOutSerialDev->Handle,
|
||||
&gEfiSerialIoProtocolGuid, &StdOutSerialDev->SerialIo,
|
||||
&gEfiDevicePathProtocolGuid, &StdOutSerialDev->DevicePath,
|
||||
&gEfiSerialIoProtocolGuid,
|
||||
&StdOutSerialDev->SerialIo,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
&StdOutSerialDev->DevicePath,
|
||||
NULL
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
@@ -538,10 +532,11 @@ GdbInitializeSerialConsole (
|
||||
// Make a new handle with Serial IO protocol and its device path on it.
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||
&StdErrSerialDev->Handle,
|
||||
&gEfiSerialIoProtocolGuid, &StdErrSerialDev->SerialIo,
|
||||
&gEfiDevicePathProtocolGuid, &StdErrSerialDev->DevicePath,
|
||||
&gEfiSerialIoProtocolGuid,
|
||||
&StdErrSerialDev->SerialIo,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
&StdErrSerialDev->DevicePath,
|
||||
NULL
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
}
|
||||
|
||||
|
@@ -12,7 +12,7 @@
|
||||
//
|
||||
// Array of exception types that need to be hooked by the debugger
|
||||
//
|
||||
EFI_EXCEPTION_TYPE_ENTRY gExceptionType[] = {
|
||||
EFI_EXCEPTION_TYPE_ENTRY gExceptionType[] = {
|
||||
{ EXCEPT_X64_DIVIDE_ERROR, GDB_SIGFPE },
|
||||
{ EXCEPT_X64_DEBUG, GDB_SIGTRAP },
|
||||
{ EXCEPT_X64_NMI, GDB_SIGEMT },
|
||||
@@ -29,39 +29,37 @@ EFI_EXCEPTION_TYPE_ENTRY gExceptionType[] = {
|
||||
{ EXCEPT_X64_MACHINE_CHECK, GDB_SIGEMT }
|
||||
};
|
||||
|
||||
|
||||
// The offsets of registers SystemContextX64.
|
||||
// The fields in the array are in the gdb ordering.
|
||||
// HAVE TO DOUBLE-CHECK THE ORDER of the 24 regs
|
||||
//
|
||||
UINTN gRegisterOffsets[] = {
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, Rax),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, Rcx),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, Rdx),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, Rbx),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, Rsp),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, Rbp),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, Rsi),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, Rdi),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, Rip),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, Rflags),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, Cs),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, Ss),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, Ds),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, Es),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, Fs),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, Gs),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, R8),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, R9),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, R10),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, R11),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, R12),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, R13),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, R14),
|
||||
OFFSET_OF(EFI_SYSTEM_CONTEXT_X64, R15)
|
||||
UINTN gRegisterOffsets[] = {
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, Rax),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, Rcx),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, Rdx),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, Rbx),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, Rsp),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, Rbp),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, Rsi),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, Rdi),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, Rip),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, Rflags),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, Cs),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, Ss),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, Ds),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, Es),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, Fs),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, Gs),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, R8),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, R9),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, R10),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, R11),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, R12),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, R13),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, R14),
|
||||
OFFSET_OF (EFI_SYSTEM_CONTEXT_X64, R15)
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
Return the number of entries in the gExceptionType[]
|
||||
|
||||
@@ -75,7 +73,6 @@ MaxEfiException (
|
||||
return sizeof (gExceptionType)/sizeof (EFI_EXCEPTION_TYPE_ENTRY);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Return the number of entries in the gRegisters[]
|
||||
|
||||
@@ -89,7 +86,6 @@ MaxRegisterCount (
|
||||
return sizeof (gRegisterOffsets)/sizeof (UINTN);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Check to see if the ISA is supported.
|
||||
ISA = Instruction Set Architecture
|
||||
@@ -104,7 +100,6 @@ CheckIsa (
|
||||
return (BOOLEAN)(Isa == IsaX64);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
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 X64 member
|
||||
@@ -113,17 +108,17 @@ CheckIsa (
|
||||
@retval the pointer to the RegNumber-th pointer
|
||||
**/
|
||||
UINTN *
|
||||
FindPointerToRegister(
|
||||
FindPointerToRegister (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN UINTN RegNumber
|
||||
)
|
||||
{
|
||||
UINT8 *TempPtr;
|
||||
UINT8 *TempPtr;
|
||||
|
||||
TempPtr = ((UINT8 *)SystemContext.SystemContextX64) + gRegisterOffsets[RegNumber];
|
||||
return (UINTN *)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
|
||||
@@ -133,23 +128,23 @@ FindPointerToRegister(
|
||||
**/
|
||||
CHAR8 *
|
||||
BasicReadRegister (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN UINTN RegNumber,
|
||||
IN CHAR8 *OutBufPtr
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN UINTN RegNumber,
|
||||
IN CHAR8 *OutBufPtr
|
||||
)
|
||||
{
|
||||
UINTN RegSize;
|
||||
UINTN RegSize;
|
||||
|
||||
RegSize = 0;
|
||||
while (RegSize < 64) {
|
||||
*OutBufPtr++ = mHexToStr[((*FindPointerToRegister(SystemContext, RegNumber) >> (RegSize+4)) & 0xf)];
|
||||
*OutBufPtr++ = mHexToStr[((*FindPointerToRegister(SystemContext, RegNumber) >> RegSize) & 0xf)];
|
||||
RegSize = RegSize + 8;
|
||||
*OutBufPtr++ = mHexToStr[((*FindPointerToRegister (SystemContext, RegNumber) >> (RegSize+4)) & 0xf)];
|
||||
*OutBufPtr++ = mHexToStr[((*FindPointerToRegister (SystemContext, RegNumber) >> RegSize) & 0xf)];
|
||||
RegSize = RegSize + 8;
|
||||
}
|
||||
|
||||
return OutBufPtr;
|
||||
}
|
||||
|
||||
|
||||
/** ‘p n’
|
||||
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
|
||||
@@ -157,29 +152,28 @@ BasicReadRegister (
|
||||
**/
|
||||
VOID
|
||||
ReadNthRegister (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN CHAR8 *InBuffer
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN CHAR8 *InBuffer
|
||||
)
|
||||
{
|
||||
UINTN RegNumber;
|
||||
CHAR8 OutBuffer[17]; // 1 reg=16 hex chars, and the end '\0' (escape seq)
|
||||
CHAR8 *OutBufPtr; // pointer to the output buffer
|
||||
UINTN RegNumber;
|
||||
CHAR8 OutBuffer[17]; // 1 reg=16 hex chars, and the end '\0' (escape seq)
|
||||
CHAR8 *OutBufPtr; // pointer to the output buffer
|
||||
|
||||
RegNumber = AsciiStrHexToUintn (&InBuffer[1]);
|
||||
|
||||
if ((RegNumber < 0) || (RegNumber >= MaxRegisterCount())) {
|
||||
if ((RegNumber < 0) || (RegNumber >= MaxRegisterCount ())) {
|
||||
SendError (GDB_EINVALIDREGNUM);
|
||||
return;
|
||||
}
|
||||
|
||||
OutBufPtr = OutBuffer;
|
||||
OutBufPtr = BasicReadRegister(SystemContext, RegNumber, OutBufPtr);
|
||||
OutBufPtr = BasicReadRegister (SystemContext, RegNumber, OutBufPtr);
|
||||
|
||||
*OutBufPtr = '\0'; // the end of the buffer
|
||||
SendPacket (OutBuffer);
|
||||
}
|
||||
|
||||
|
||||
/** ‘g’
|
||||
Reads the general registers into an output buffer and sends it as a packet
|
||||
|
||||
@@ -188,23 +182,23 @@ ReadNthRegister (
|
||||
VOID
|
||||
EFIAPI
|
||||
ReadGeneralRegisters (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext
|
||||
)
|
||||
{
|
||||
UINTN i;
|
||||
CHAR8 OutBuffer[385]; // 24 regs, 16 hex chars each, and the end '\0' (escape seq)
|
||||
CHAR8 *OutBufPtr; // pointer to the output buffer
|
||||
UINTN i;
|
||||
CHAR8 OutBuffer[385]; // 24 regs, 16 hex chars each, and the end '\0' (escape seq)
|
||||
CHAR8 *OutBufPtr; // pointer to the output buffer
|
||||
|
||||
OutBufPtr = OutBuffer;
|
||||
for(i = 0 ; i < MaxRegisterCount() ; i++) { // there are only 24 registers to read
|
||||
OutBufPtr = BasicReadRegister(SystemContext, i, OutBufPtr);
|
||||
for (i = 0; i < MaxRegisterCount (); i++) {
|
||||
// there are only 24 registers to read
|
||||
OutBufPtr = BasicReadRegister (SystemContext, i, OutBufPtr);
|
||||
}
|
||||
|
||||
*OutBufPtr = '\0'; // the end of the buffer
|
||||
SendPacket (OutBuffer);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Adds the RegNumber-th register's value to the output buffer, starting at the given OutBufPtr
|
||||
|
||||
@@ -220,14 +214,14 @@ BasicWriteRegister (
|
||||
IN CHAR8 *InBufPtr
|
||||
)
|
||||
{
|
||||
UINTN RegSize;
|
||||
UINTN TempValue; // the value transferred from a hex char
|
||||
UINT64 NewValue; // the new value of the RegNumber-th Register
|
||||
UINTN RegSize;
|
||||
UINTN TempValue; // the value transferred from a hex char
|
||||
UINT64 NewValue; // the new value of the RegNumber-th Register
|
||||
|
||||
NewValue = 0;
|
||||
RegSize = 0;
|
||||
RegSize = 0;
|
||||
while (RegSize < 64) {
|
||||
TempValue = HexCharToInt(*InBufPtr++);
|
||||
TempValue = HexCharToInt (*InBufPtr++);
|
||||
|
||||
if (TempValue < 0) {
|
||||
SendError (GDB_EBADMEMDATA);
|
||||
@@ -235,21 +229,21 @@ BasicWriteRegister (
|
||||
}
|
||||
|
||||
NewValue += (TempValue << (RegSize+4));
|
||||
TempValue = HexCharToInt(*InBufPtr++);
|
||||
TempValue = HexCharToInt (*InBufPtr++);
|
||||
|
||||
if (TempValue < 0) {
|
||||
SendError (GDB_EBADMEMDATA);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
NewValue += (TempValue << RegSize);
|
||||
RegSize = RegSize + 8;
|
||||
RegSize = RegSize + 8;
|
||||
}
|
||||
*(FindPointerToRegister(SystemContext, RegNumber)) = NewValue;
|
||||
|
||||
*(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
|
||||
|
||||
@@ -259,35 +253,36 @@ BasicWriteRegister (
|
||||
VOID
|
||||
EFIAPI
|
||||
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 < 0) || (RegNumber >= MaxRegisterCount())) {
|
||||
if ((RegNumber < 0) || (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
|
||||
|
||||
@@ -297,17 +292,18 @@ WriteNthRegister (
|
||||
VOID
|
||||
EFIAPI
|
||||
WriteGeneralRegisters (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN CHAR8 *InBuffer
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN CHAR8 *InBuffer
|
||||
)
|
||||
{
|
||||
UINTN i;
|
||||
CHAR8 *InBufPtr; /// pointer to the input buffer
|
||||
CHAR8 *InBufPtr; /// pointer to the input buffer
|
||||
|
||||
// check to see if the buffer is the right size which is
|
||||
// 1 (for 'G') + 16 (for 16 registers) * 8 ( for 8 hex chars each) = 385
|
||||
if (AsciiStrLen(InBuffer) != 385) { // 24 regs, 16 hex chars each, and the end '\0' (escape seq)
|
||||
//Bad message. Message is not the right length
|
||||
if (AsciiStrLen (InBuffer) != 385) {
|
||||
// 24 regs, 16 hex chars each, and the end '\0' (escape seq)
|
||||
// Bad message. Message is not the right length
|
||||
SendError (GDB_EBADBUFSIZE);
|
||||
return;
|
||||
}
|
||||
@@ -316,29 +312,27 @@ WriteGeneralRegisters (
|
||||
|
||||
// Read the new values for the registers from the input buffer to an array, NewValueArray.
|
||||
// The values in the array are in the gdb ordering
|
||||
for(i=0; i < MaxRegisterCount(); i++) { // there are only 16 registers to write
|
||||
InBufPtr = BasicWriteRegister(SystemContext, i, InBufPtr);
|
||||
for (i = 0; i < MaxRegisterCount (); i++) {
|
||||
// there are only 16 registers to write
|
||||
InBufPtr = BasicWriteRegister (SystemContext, i, InBufPtr);
|
||||
}
|
||||
|
||||
SendSuccess();
|
||||
SendSuccess ();
|
||||
}
|
||||
|
||||
/**
|
||||
Insert Single Step in the SystemContext
|
||||
|
||||
/**
|
||||
Insert Single Step in the SystemContext
|
||||
|
||||
@param SystemContext Register content at time of the exception
|
||||
**/
|
||||
@param SystemContext Register content at time of the exception
|
||||
**/
|
||||
VOID
|
||||
AddSingleStep (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext
|
||||
)
|
||||
{
|
||||
SystemContext.SystemContextX64->Rflags |= TF_BIT; //Setting the TF bit.
|
||||
SystemContext.SystemContextX64->Rflags |= TF_BIT; // Setting the TF bit.
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Remove Single Step in the SystemContext
|
||||
|
||||
@@ -352,8 +346,6 @@ RemoveSingleStep (
|
||||
SystemContext.SystemContextX64->Rflags &= ~TF_BIT; // clearing the TF bit.
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** ‘c [addr ]’
|
||||
Continue. addr is Address to resume. If addr is omitted, resume at current
|
||||
Address.
|
||||
@@ -363,16 +355,15 @@ RemoveSingleStep (
|
||||
VOID
|
||||
EFIAPI
|
||||
ContinueAtAddress (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN CHAR8 *PacketData
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN CHAR8 *PacketData
|
||||
)
|
||||
{
|
||||
if (PacketData[1] != '\0') {
|
||||
SystemContext.SystemContextX64->Rip = AsciiStrHexToUintn(&PacketData[1]);
|
||||
SystemContext.SystemContextX64->Rip = AsciiStrHexToUintn (&PacketData[1]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/** ‘s [addr ]’
|
||||
Single step. addr is the Address at which to resume. If addr is omitted, resume
|
||||
at same Address.
|
||||
@@ -382,8 +373,8 @@ ContinueAtAddress (
|
||||
VOID
|
||||
EFIAPI
|
||||
SingleStep (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN CHAR8 *PacketData
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN CHAR8 *PacketData
|
||||
)
|
||||
{
|
||||
if (PacketData[1] != '\0') {
|
||||
@@ -393,7 +384,6 @@ SingleStep (
|
||||
AddSingleStep (SystemContext);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Returns breakpoint data address from DR0-DR3 based on the input breakpoint
|
||||
number
|
||||
@@ -411,7 +401,7 @@ GetBreakpointDataAddress (
|
||||
IN UINTN BreakpointNumber
|
||||
)
|
||||
{
|
||||
UINTN Address;
|
||||
UINTN Address;
|
||||
|
||||
if (BreakpointNumber == 1) {
|
||||
Address = SystemContext.SystemContextIa32->Dr0;
|
||||
@@ -444,8 +434,8 @@ GetBreakpointDetected (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext
|
||||
)
|
||||
{
|
||||
IA32_DR6 Dr6;
|
||||
UINTN BreakpointNumber;
|
||||
IA32_DR6 Dr6;
|
||||
UINTN BreakpointNumber;
|
||||
|
||||
Dr6.UintN = SystemContext.SystemContextIa32->Dr6;
|
||||
|
||||
@@ -458,7 +448,7 @@ GetBreakpointDetected (
|
||||
} else if (Dr6.Bits.B3 == 1) {
|
||||
BreakpointNumber = 4;
|
||||
} else {
|
||||
BreakpointNumber = 0; //No breakpoint detected
|
||||
BreakpointNumber = 0; // No breakpoint detected
|
||||
}
|
||||
|
||||
return BreakpointNumber;
|
||||
@@ -481,25 +471,24 @@ GetBreakpointType (
|
||||
IN UINTN BreakpointNumber
|
||||
)
|
||||
{
|
||||
IA32_DR7 Dr7;
|
||||
BREAK_TYPE Type = NotSupported; //Default is NotSupported type
|
||||
IA32_DR7 Dr7;
|
||||
BREAK_TYPE Type = NotSupported; // Default is NotSupported type
|
||||
|
||||
Dr7.UintN = SystemContext.SystemContextIa32->Dr7;
|
||||
|
||||
if (BreakpointNumber == 1) {
|
||||
Type = (BREAK_TYPE) Dr7.Bits.RW0;
|
||||
Type = (BREAK_TYPE)Dr7.Bits.RW0;
|
||||
} else if (BreakpointNumber == 2) {
|
||||
Type = (BREAK_TYPE) Dr7.Bits.RW1;
|
||||
Type = (BREAK_TYPE)Dr7.Bits.RW1;
|
||||
} else if (BreakpointNumber == 3) {
|
||||
Type = (BREAK_TYPE) Dr7.Bits.RW2;
|
||||
Type = (BREAK_TYPE)Dr7.Bits.RW2;
|
||||
} else if (BreakpointNumber == 4) {
|
||||
Type = (BREAK_TYPE) Dr7.Bits.RW3;
|
||||
Type = (BREAK_TYPE)Dr7.Bits.RW3;
|
||||
}
|
||||
|
||||
return Type;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Parses Length and returns the length which DR7 LENn field accepts.
|
||||
For example: If we receive 1-Byte length then we should return 0.
|
||||
@@ -512,21 +501,24 @@ GetBreakpointType (
|
||||
**/
|
||||
UINTN
|
||||
ConvertLengthData (
|
||||
IN UINTN Length
|
||||
IN UINTN Length
|
||||
)
|
||||
{
|
||||
if (Length == 1) { //1-Byte length
|
||||
if (Length == 1) {
|
||||
// 1-Byte length
|
||||
return 0;
|
||||
} else if (Length == 2) { //2-Byte length
|
||||
} else if (Length == 2) {
|
||||
// 2-Byte length
|
||||
return 1;
|
||||
} else if (Length == 4) { //4-Byte length
|
||||
} else if (Length == 4) {
|
||||
// 4-Byte length
|
||||
return 3;
|
||||
} else { //Undefined or 8-byte length
|
||||
} else {
|
||||
// Undefined or 8-byte length
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Finds the next free debug register. If all the registers are occupied then
|
||||
EFI_OUT_OF_RESOURCES is returned.
|
||||
@@ -543,7 +535,7 @@ FindNextFreeDebugRegister (
|
||||
OUT UINTN *Register
|
||||
)
|
||||
{
|
||||
IA32_DR7 Dr7;
|
||||
IA32_DR7 Dr7;
|
||||
|
||||
Dr7.UintN = SystemContext.SystemContextIa32->Dr7;
|
||||
|
||||
@@ -562,7 +554,6 @@ FindNextFreeDebugRegister (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Enables the debug register. Writes Address value to appropriate DR0-3 register.
|
||||
Sets LENn, Gn, RWn bits in DR7 register.
|
||||
@@ -587,56 +578,56 @@ EnableDebugRegister (
|
||||
{
|
||||
IA32_DR7 Dr7;
|
||||
|
||||
//Convert length data
|
||||
// Convert length data
|
||||
Length = ConvertLengthData (Length);
|
||||
|
||||
//For Instruction execution, length should be 0
|
||||
//(Ref. Intel reference manual 18.2.4)
|
||||
// For Instruction execution, length should be 0
|
||||
// (Ref. Intel reference manual 18.2.4)
|
||||
if ((Type == 0) && (Length != 0)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
//Hardware doesn't support ReadWatch (z3 packet) type. GDB can handle
|
||||
//software breakpoint. We should send empty packet in both these cases.
|
||||
// Hardware doesn't support ReadWatch (z3 packet) type. GDB can handle
|
||||
// software breakpoint. We should send empty packet in both these cases.
|
||||
if ((Type == (BREAK_TYPE)DataRead) ||
|
||||
(Type == (BREAK_TYPE)SoftwareBreakpoint)) {
|
||||
(Type == (BREAK_TYPE)SoftwareBreakpoint))
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
//Read DR7 so appropriate Gn, RWn and LENn bits can be modified.
|
||||
// Read DR7 so appropriate Gn, RWn and LENn bits can be modified.
|
||||
Dr7.UintN = SystemContext.SystemContextIa32->Dr7;
|
||||
|
||||
if (Register == 0) {
|
||||
SystemContext.SystemContextIa32->Dr0 = Address;
|
||||
Dr7.Bits.G0 = 1;
|
||||
Dr7.Bits.RW0 = Type;
|
||||
Dr7.Bits.LEN0 = Length;
|
||||
Dr7.Bits.G0 = 1;
|
||||
Dr7.Bits.RW0 = Type;
|
||||
Dr7.Bits.LEN0 = Length;
|
||||
} else if (Register == 1) {
|
||||
SystemContext.SystemContextIa32->Dr1 = Address;
|
||||
Dr7.Bits.G1 = 1;
|
||||
Dr7.Bits.RW1 = Type;
|
||||
Dr7.Bits.LEN1 = Length;
|
||||
Dr7.Bits.G1 = 1;
|
||||
Dr7.Bits.RW1 = Type;
|
||||
Dr7.Bits.LEN1 = Length;
|
||||
} else if (Register == 2) {
|
||||
SystemContext.SystemContextIa32->Dr2 = Address;
|
||||
Dr7.Bits.G2 = 1;
|
||||
Dr7.Bits.RW2 = Type;
|
||||
Dr7.Bits.LEN2 = Length;
|
||||
Dr7.Bits.G2 = 1;
|
||||
Dr7.Bits.RW2 = Type;
|
||||
Dr7.Bits.LEN2 = Length;
|
||||
} else if (Register == 3) {
|
||||
SystemContext.SystemContextIa32->Dr3 = Address;
|
||||
Dr7.Bits.G3 = 1;
|
||||
Dr7.Bits.RW3 = Type;
|
||||
Dr7.Bits.LEN3 = Length;
|
||||
Dr7.Bits.G3 = 1;
|
||||
Dr7.Bits.RW3 = Type;
|
||||
Dr7.Bits.LEN3 = Length;
|
||||
} else {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
//Update Dr7 with appropriate Gn, RWn and LENn bits
|
||||
// Update Dr7 with appropriate Gn, RWn and LENn bits
|
||||
SystemContext.SystemContextIa32->Dr7 = Dr7.UintN;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Returns register number 0 - 3 for the matching debug register.
|
||||
This function compares incoming Address, Type, Length and
|
||||
@@ -655,46 +646,51 @@ EnableDebugRegister (
|
||||
**/
|
||||
EFI_STATUS
|
||||
FindMatchingDebugRegister (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN UINTN Address,
|
||||
IN UINTN Length,
|
||||
IN UINTN Type,
|
||||
OUT UINTN *Register
|
||||
)
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN UINTN Address,
|
||||
IN UINTN Length,
|
||||
IN UINTN Type,
|
||||
OUT UINTN *Register
|
||||
)
|
||||
{
|
||||
IA32_DR7 Dr7;
|
||||
IA32_DR7 Dr7;
|
||||
|
||||
//Hardware doesn't support ReadWatch (z3 packet) type. GDB can handle
|
||||
//software breakpoint. We should send empty packet in both these cases.
|
||||
// Hardware doesn't support ReadWatch (z3 packet) type. GDB can handle
|
||||
// software breakpoint. We should send empty packet in both these cases.
|
||||
if ((Type == (BREAK_TYPE)DataRead) ||
|
||||
(Type == (BREAK_TYPE)SoftwareBreakpoint)) {
|
||||
(Type == (BREAK_TYPE)SoftwareBreakpoint))
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
//Convert length data
|
||||
Length = ConvertLengthData(Length);
|
||||
// Convert length data
|
||||
Length = ConvertLengthData (Length);
|
||||
|
||||
Dr7.UintN = SystemContext.SystemContextIa32->Dr7;
|
||||
|
||||
if ((Dr7.Bits.G0 == 1) &&
|
||||
(Dr7.Bits.LEN0 == Length) &&
|
||||
(Dr7.Bits.RW0 == Type) &&
|
||||
(Address == SystemContext.SystemContextIa32->Dr0)) {
|
||||
(Address == SystemContext.SystemContextIa32->Dr0))
|
||||
{
|
||||
*Register = 0;
|
||||
} else if ((Dr7.Bits.G1 == 1) &&
|
||||
(Dr7.Bits.LEN1 == Length) &&
|
||||
(Dr7.Bits.RW1 == Type) &&
|
||||
(Address == SystemContext.SystemContextIa32->Dr1)) {
|
||||
(Address == SystemContext.SystemContextIa32->Dr1))
|
||||
{
|
||||
*Register = 1;
|
||||
} else if ((Dr7.Bits.G2 == 1) &&
|
||||
(Dr7.Bits.LEN2 == Length) &&
|
||||
(Dr7.Bits.RW2 == Type) &&
|
||||
(Address == SystemContext.SystemContextIa32->Dr2)) {
|
||||
(Address == SystemContext.SystemContextIa32->Dr2))
|
||||
{
|
||||
*Register = 2;
|
||||
} else if ((Dr7.Bits.G3 == 1) &&
|
||||
(Dr7.Bits.LEN3 == Length) &&
|
||||
(Dr7.Bits.RW3 == Type) &&
|
||||
(Address == SystemContext.SystemContextIa32->Dr3)) {
|
||||
(Address == SystemContext.SystemContextIa32->Dr3))
|
||||
{
|
||||
*Register = 3;
|
||||
} else {
|
||||
Print ((CHAR16 *)L"No match found..\n");
|
||||
@@ -704,7 +700,6 @@ FindMatchingDebugRegister (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Disables the particular debug register.
|
||||
|
||||
@@ -716,41 +711,41 @@ FindMatchingDebugRegister (
|
||||
**/
|
||||
EFI_STATUS
|
||||
DisableDebugRegister (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN UINTN Register
|
||||
)
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN UINTN Register
|
||||
)
|
||||
{
|
||||
IA32_DR7 Dr7;
|
||||
UINTN Address = 0;
|
||||
UINTN Address = 0;
|
||||
|
||||
//Read DR7 register so appropriate Gn, RWn and LENn bits can be turned off.
|
||||
// Read DR7 register so appropriate Gn, RWn and LENn bits can be turned off.
|
||||
Dr7.UintN = SystemContext.SystemContextIa32->Dr7;
|
||||
|
||||
if (Register == 0) {
|
||||
SystemContext.SystemContextIa32->Dr0 = Address;
|
||||
Dr7.Bits.G0 = 0;
|
||||
Dr7.Bits.RW0 = 0;
|
||||
Dr7.Bits.LEN0 = 0;
|
||||
Dr7.Bits.G0 = 0;
|
||||
Dr7.Bits.RW0 = 0;
|
||||
Dr7.Bits.LEN0 = 0;
|
||||
} else if (Register == 1) {
|
||||
SystemContext.SystemContextIa32->Dr1 = Address;
|
||||
Dr7.Bits.G1 = 0;
|
||||
Dr7.Bits.RW1 = 0;
|
||||
Dr7.Bits.LEN1 = 0;
|
||||
Dr7.Bits.G1 = 0;
|
||||
Dr7.Bits.RW1 = 0;
|
||||
Dr7.Bits.LEN1 = 0;
|
||||
} else if (Register == 2) {
|
||||
SystemContext.SystemContextIa32->Dr2 = Address;
|
||||
Dr7.Bits.G2 = 0;
|
||||
Dr7.Bits.RW2 = 0;
|
||||
Dr7.Bits.LEN2 = 0;
|
||||
Dr7.Bits.G2 = 0;
|
||||
Dr7.Bits.RW2 = 0;
|
||||
Dr7.Bits.LEN2 = 0;
|
||||
} else if (Register == 3) {
|
||||
SystemContext.SystemContextIa32->Dr3 = Address;
|
||||
Dr7.Bits.G3 = 0;
|
||||
Dr7.Bits.RW3 = 0;
|
||||
Dr7.Bits.LEN3 = 0;
|
||||
Dr7.Bits.G3 = 0;
|
||||
Dr7.Bits.RW3 = 0;
|
||||
Dr7.Bits.LEN3 = 0;
|
||||
} else {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
//Update DR7 register so appropriate Gn, RWn and LENn bits can be turned off.
|
||||
// Update DR7 register so appropriate Gn, RWn and LENn bits can be turned off.
|
||||
SystemContext.SystemContextIa32->Dr7 = Dr7.UintN;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
@@ -772,16 +767,16 @@ VOID
|
||||
EFIAPI
|
||||
InsertBreakPoint (
|
||||
IN EFI_SYSTEM_CONTEXT SystemContext,
|
||||
IN CHAR8 *PacketData
|
||||
IN CHAR8 *PacketData
|
||||
)
|
||||
{
|
||||
UINTN Type;
|
||||
UINTN Address;
|
||||
UINTN Length;
|
||||
UINTN Register;
|
||||
EFI_STATUS Status;
|
||||
BREAK_TYPE BreakType = NotSupported;
|
||||
UINTN ErrorCode;
|
||||
UINTN Type;
|
||||
UINTN Address;
|
||||
UINTN Length;
|
||||
UINTN Register;
|
||||
EFI_STATUS Status;
|
||||
BREAK_TYPE BreakType = NotSupported;
|
||||
UINTN ErrorCode;
|
||||
|
||||
ErrorCode = ParseBreakpointPacket (PacketData, &Type, &Address, &Length);
|
||||
if (ErrorCode > 0) {
|
||||
@@ -790,28 +785,27 @@ InsertBreakPoint (
|
||||
}
|
||||
|
||||
switch (Type) {
|
||||
|
||||
case 0: //Software breakpoint
|
||||
case 0: // Software breakpoint
|
||||
BreakType = SoftwareBreakpoint;
|
||||
break;
|
||||
|
||||
case 1: //Hardware breakpoint
|
||||
case 1: // Hardware breakpoint
|
||||
BreakType = InstructionExecution;
|
||||
break;
|
||||
|
||||
case 2: //Write watchpoint
|
||||
case 2: // Write watchpoint
|
||||
BreakType = DataWrite;
|
||||
break;
|
||||
|
||||
case 3: //Read watchpoint
|
||||
case 3: // Read watchpoint
|
||||
BreakType = DataRead;
|
||||
break;
|
||||
|
||||
case 4: //Access watchpoint
|
||||
case 4: // Access watchpoint
|
||||
BreakType = DataReadWrite;
|
||||
break;
|
||||
|
||||
default :
|
||||
default:
|
||||
Print ((CHAR16 *)L"Insert breakpoint default: %x\n", Type);
|
||||
SendError (GDB_EINVALIDBRKPOINTTYPE);
|
||||
return;
|
||||
@@ -819,7 +813,7 @@ InsertBreakPoint (
|
||||
|
||||
// Find next free debug register
|
||||
Status = FindNextFreeDebugRegister (SystemContext, &Register);
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print ((CHAR16 *)L"No space left on device\n");
|
||||
SendError (GDB_ENOSPACE);
|
||||
return;
|
||||
@@ -827,11 +821,10 @@ InsertBreakPoint (
|
||||
|
||||
// Write Address, length data at particular DR register
|
||||
Status = EnableDebugRegister (SystemContext, Register, Address, Length, (UINTN)BreakType);
|
||||
if (EFI_ERROR(Status)) {
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
if (Status == EFI_UNSUPPORTED) {
|
||||
Print ((CHAR16 *)L"Not supported\n");
|
||||
SendNotSupported();
|
||||
SendNotSupported ();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -843,7 +836,6 @@ InsertBreakPoint (
|
||||
SendSuccess ();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
‘z1, [addr], [length]’
|
||||
‘z2, [addr], [length]’
|
||||
@@ -862,15 +854,15 @@ RemoveBreakPoint (
|
||||
IN CHAR8 *PacketData
|
||||
)
|
||||
{
|
||||
UINTN Type;
|
||||
UINTN Address;
|
||||
UINTN Length;
|
||||
UINTN Register;
|
||||
BREAK_TYPE BreakType = NotSupported;
|
||||
EFI_STATUS Status;
|
||||
UINTN ErrorCode;
|
||||
UINTN Type;
|
||||
UINTN Address;
|
||||
UINTN Length;
|
||||
UINTN Register;
|
||||
BREAK_TYPE BreakType = NotSupported;
|
||||
EFI_STATUS Status;
|
||||
UINTN ErrorCode;
|
||||
|
||||
//Parse breakpoint packet data
|
||||
// Parse breakpoint packet data
|
||||
ErrorCode = ParseBreakpointPacket (PacketData, &Type, &Address, &Length);
|
||||
if (ErrorCode > 0) {
|
||||
SendError ((UINT8)ErrorCode);
|
||||
@@ -878,39 +870,37 @@ RemoveBreakPoint (
|
||||
}
|
||||
|
||||
switch (Type) {
|
||||
|
||||
case 0: //Software breakpoint
|
||||
case 0: // Software breakpoint
|
||||
BreakType = SoftwareBreakpoint;
|
||||
break;
|
||||
|
||||
case 1: //Hardware breakpoint
|
||||
case 1: // Hardware breakpoint
|
||||
BreakType = InstructionExecution;
|
||||
break;
|
||||
|
||||
case 2: //Write watchpoint
|
||||
case 2: // Write watchpoint
|
||||
BreakType = DataWrite;
|
||||
break;
|
||||
|
||||
case 3: //Read watchpoint
|
||||
case 3: // Read watchpoint
|
||||
BreakType = DataRead;
|
||||
break;
|
||||
|
||||
case 4: //Access watchpoint
|
||||
case 4: // Access watchpoint
|
||||
BreakType = DataReadWrite;
|
||||
break;
|
||||
|
||||
default :
|
||||
default:
|
||||
SendError (GDB_EINVALIDBRKPOINTTYPE);
|
||||
return;
|
||||
}
|
||||
|
||||
//Find matching debug register
|
||||
// Find matching debug register
|
||||
Status = FindMatchingDebugRegister (SystemContext, Address, Length, (UINTN)BreakType, &Register);
|
||||
if (EFI_ERROR(Status)) {
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
if (Status == EFI_UNSUPPORTED) {
|
||||
Print ((CHAR16 *)L"Not supported.\n");
|
||||
SendNotSupported();
|
||||
SendNotSupported ();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -919,9 +909,9 @@ RemoveBreakPoint (
|
||||
return;
|
||||
}
|
||||
|
||||
//Remove breakpoint
|
||||
Status = DisableDebugRegister(SystemContext, Register);
|
||||
if (EFI_ERROR(Status)) {
|
||||
// Remove breakpoint
|
||||
Status = DisableDebugRegister (SystemContext, Register);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print ((CHAR16 *)L"Invalid argument.\n");
|
||||
SendError (GDB_EINVALIDARG);
|
||||
return;
|
||||
@@ -930,7 +920,6 @@ RemoveBreakPoint (
|
||||
SendSuccess ();
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
InitializeProcessor (
|
||||
VOID
|
||||
@@ -948,10 +937,9 @@ 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
|
||||
)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user