diff options
Diffstat (limited to 'EmbeddedPkg/GdbStub/X64')
-rw-r--r-- | EmbeddedPkg/GdbStub/X64/Processor.c | 178 |
1 files changed, 89 insertions, 89 deletions
diff --git a/EmbeddedPkg/GdbStub/X64/Processor.c b/EmbeddedPkg/GdbStub/X64/Processor.c index 5d13c937ee..8a39c4828f 100644 --- a/EmbeddedPkg/GdbStub/X64/Processor.c +++ b/EmbeddedPkg/GdbStub/X64/Processor.c @@ -2,7 +2,7 @@ Processor specific parts of the GDB stub
Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
-
+
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
@@ -19,7 +19,7 @@ // Array of exception types that need to be hooked by the debugger
//
EFI_EXCEPTION_TYPE_ENTRY gExceptionType[] = {
- { EXCEPT_X64_DIVIDE_ERROR, GDB_SIGFPE },
+ { EXCEPT_X64_DIVIDE_ERROR, GDB_SIGFPE },
{ EXCEPT_X64_DEBUG, GDB_SIGTRAP },
{ EXCEPT_X64_NMI, GDB_SIGEMT },
{ EXCEPT_X64_BREAKPOINT, GDB_SIGTRAP },
@@ -37,7 +37,7 @@ EFI_EXCEPTION_TYPE_ENTRY gExceptionType[] = { // The offsets of registers SystemContextX64.
-// The fields in the array are in the gdb ordering.
+// The fields in the array are in the gdb ordering.
// HAVE TO DOUBLE-CHECK THE ORDER of the 24 regs
//
UINTN gRegisterOffsets[] = {
@@ -70,8 +70,8 @@ UINTN gRegisterOffsets[] = { /**
Return the number of entries in the gExceptionType[]
-
- @retval UINTN, the number of entries in the gExceptionType[] array.
+
+ @retval UINTN, the number of entries in the gExceptionType[] array.
**/
UINTN
MaxEfiException (
@@ -84,8 +84,8 @@ MaxEfiException ( /**
Return the number of entries in the gRegisters[]
-
- @retval UINTN, the number of entries (registers) in the gRegisters[] array.
+
+ @retval UINTN, the number of entries (registers) in the gRegisters[] array.
**/
UINTN
MaxRegisterCount (
@@ -95,9 +95,9 @@ MaxRegisterCount ( return sizeof (gRegisterOffsets)/sizeof (UINTN);
}
-
+
/**
- Check to see if the ISA is supported.
+ Check to see if the ISA is supported.
ISA = Instruction Set Architecture
@retval TRUE if Isa is supported
@@ -114,14 +114,14 @@ 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 X64 member
- @param SystemContext Register content at time of the exception
+ @param SystemContext Register content at time of the exception
@param RegNumber The register to which we want to find a pointer
@retval the pointer to the RegNumber-th pointer
**/
UINTN *
FindPointerToRegister(
IN EFI_SYSTEM_CONTEXT SystemContext,
- IN UINTN RegNumber
+ IN UINTN RegNumber
)
{
UINT8 *TempPtr;
@@ -145,7 +145,7 @@ BasicReadRegister ( )
{
UINTN RegSize;
-
+
RegSize = 0;
while (RegSize < 64) {
*OutBufPtr++ = mHexToStr[((*FindPointerToRegister(SystemContext, RegNumber) >> (RegSize+4)) & 0xf)];
@@ -156,8 +156,8 @@ BasicReadRegister ( }
-/** ‘p n’
- Reads the n-th register's value into an output buffer and sends it as a packet
+/** ‘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
@param InBuffer Pointer to the input buffer received from gdb server
**/
@@ -170,42 +170,42 @@ ReadNthRegister ( 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())) {
- SendError (GDB_EINVALIDREGNUM);
+ SendError (GDB_EINVALIDREGNUM);
return;
}
-
+
OutBufPtr = OutBuffer;
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
+/** ‘g’
+ Reads the general registers into an output buffer and sends it as a packet
@param SystemContext Register content at time of the exception
**/
VOID
EFIAPI
-ReadGeneralRegisters (
+ReadGeneralRegisters (
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
-
+
OutBufPtr = OutBuffer;
- for(i = 0 ; i < MaxRegisterCount() ; i++) { // there are only 24 registers to read
+ 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);
}
@@ -229,26 +229,26 @@ BasicWriteRegister ( 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;
while (RegSize < 64) {
TempValue = HexCharToInt(*InBufPtr++);
-
+
if (TempValue < 0) {
- SendError (GDB_EBADMEMDATA);
+ SendError (GDB_EBADMEMDATA);
return NULL;
}
-
+
NewValue += (TempValue << (RegSize+4));
TempValue = HexCharToInt(*InBufPtr++);
-
+
if (TempValue < 0) {
- SendError (GDB_EBADMEMDATA);
+ SendError (GDB_EBADMEMDATA);
return NULL;
}
-
- NewValue += (TempValue << RegSize);
+
+ NewValue += (TempValue << RegSize);
RegSize = RegSize + 8;
}
*(FindPointerToRegister(SystemContext, RegNumber)) = NewValue;
@@ -273,19 +273,19 @@ WriteNthRegister ( 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];
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())) {
- SendError (GDB_EINVALIDREGNUM);
+ SendError (GDB_EINVALIDREGNUM);
return;
}
InBufPtr++; // skips the '=' character
@@ -309,30 +309,30 @@ WriteGeneralRegisters ( {
UINTN i;
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
+
+ // 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
- SendError (GDB_EBADBUFSIZE);
+ //Bad message. Message is not the right length
+ SendError (GDB_EBADBUFSIZE);
return;
}
-
+
InBufPtr = &InBuffer[1];
-
+
// 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);
}
-
+
SendSuccess();
}
- /**
+ /**
Insert Single Step in the SystemContext
-
+
@param SystemContext Register content at time of the exception
**/
VOID
@@ -343,11 +343,11 @@ AddSingleStep ( SystemContext.SystemContextX64->Rflags |= TF_BIT; //Setting the TF bit.
}
-
-
-/**
+
+
+/**
Remove Single Step in the SystemContext
-
+
@param SystemContext Register content at time of the exception
**/
VOID
@@ -360,11 +360,11 @@ RemoveSingleStep ( -/** ‘c [addr ]’
- Continue. addr is Address to resume. If addr is omitted, resume at current
+/** ‘c [addr ]’
+ Continue. addr is Address to resume. If addr is omitted, resume at current
Address.
-
- @param SystemContext Register content at time of the exception
+
+ @param SystemContext Register content at time of the exception
**/
VOID
EFIAPI
@@ -375,15 +375,15 @@ ContinueAtAddress ( {
if (PacketData[1] != '\0') {
SystemContext.SystemContextX64->Rip = AsciiStrHexToUintn(&PacketData[1]);
- }
+ }
}
/** ‘s [addr ]’
- Single step. addr is the Address at which to resume. If addr is omitted, resume
+ Single step. addr is the Address at which to resume. If addr is omitted, resume
at same Address.
-
- @param SystemContext Register content at time of the exception
+
+ @param SystemContext Register content at time of the exception
**/
VOID
EFIAPI
@@ -395,19 +395,19 @@ SingleStep ( if (PacketData[1] != '\0') {
SystemContext.SystemContextX64->Rip = AsciiStrHexToUintn (&PacketData[1]);
}
-
+
AddSingleStep (SystemContext);
}
/**
- Returns breakpoint data address from DR0-DR3 based on the input breakpoint
+ Returns breakpoint data address from DR0-DR3 based on the input breakpoint
number
@param SystemContext Register content at time of the exception
@param BreakpointNumber Breakpoint number
- @retval Address Data address from DR0-DR3 based on the
+ @retval Address Data address from DR0-DR3 based on the
breakpoint number.
**/
@@ -435,7 +435,7 @@ GetBreakpointDataAddress ( }
/**
- Returns currently detected breakpoint value based on the register
+ Returns currently detected breakpoint value based on the register
DR6 B0-B3 field.
If no breakpoint is detected then it returns 0.
@@ -471,13 +471,13 @@ GetBreakpointDetected ( }
/**
- Returns Breakpoint type (InstructionExecution, DataWrite, DataRead
+ Returns Breakpoint type (InstructionExecution, DataWrite, DataRead
or DataReadWrite) based on the Breakpoint number
@param SystemContext Register content at time of the exception
@param BreakpointNumber Breakpoint number
- @retval BREAK_TYPE Breakpoint type value read from register DR7 RWn
+ @retval BREAK_TYPE Breakpoint type value read from register DR7 RWn
field. For unknown value, it returns NotSupported.
**/
@@ -506,9 +506,9 @@ GetBreakpointType ( }
-/**
+/**
Parses Length and returns the length which DR7 LENn field accepts.
- For example: If we receive 1-Byte length then we should return 0.
+ For example: If we receive 1-Byte length then we should return 0.
Zero gets written to DR7 LENn field.
@param Length Breakpoint length in Bytes (1 byte, 2 byte, 4 byte)
@@ -521,7 +521,7 @@ ConvertLengthData ( IN UINTN Length
)
{
- if (Length == 1) { //1-Byte length
+ if (Length == 1) { //1-Byte length
return 0;
} else if (Length == 2) { //2-Byte length
return 1;
@@ -576,7 +576,7 @@ FindNextFreeDebugRegister ( @param SystemContext Register content at time of the exception
@param Register Register value (0 - 3)
@param Address Breakpoint address value
- @param Type Breakpoint type (Instruction, Data write,
+ @param Type Breakpoint type (Instruction, Data write,
Data read or write etc.)
@retval EFI_STATUS Appropriate status value.
@@ -596,7 +596,7 @@ EnableDebugRegister ( //Convert length data
Length = ConvertLengthData (Length);
- //For Instruction execution, length should be 0
+ //For Instruction execution, length should be 0
//(Ref. Intel reference manual 18.2.4)
if ((Type == 0) && (Length != 0)) {
return EFI_INVALID_PARAMETER;
@@ -604,7 +604,7 @@ EnableDebugRegister ( //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) ||
+ if ((Type == (BREAK_TYPE)DataRead) ||
(Type == (BREAK_TYPE)SoftwareBreakpoint)) {
return EFI_UNSUPPORTED;
}
@@ -643,14 +643,14 @@ EnableDebugRegister ( }
-/**
- Returns register number 0 - 3 for the maching debug register.
- This function compares incoming Address, Type, Length and
+/**
+ Returns register number 0 - 3 for the maching debug register.
+ This function compares incoming Address, Type, Length and
if there is a match then it returns the appropriate register number.
In case of mismatch, function returns EFI_NOT_FOUND message.
@param SystemContext Register content at time of the exception
- @param Address Breakpoint address value
+ @param Address Breakpoint address value
@param Length Breakpoint length value
@param Type Breakpoint type (Instruction, Data write, Data read
or write etc.)
@@ -672,7 +672,7 @@ FindMatchingDebugRegister ( //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) ||
+ if ((Type == (BREAK_TYPE)DataRead) ||
(Type == (BREAK_TYPE)SoftwareBreakpoint)) {
return EFI_UNSUPPORTED;
}
@@ -682,24 +682,24 @@ FindMatchingDebugRegister ( Dr7.UintN = SystemContext.SystemContextIa32->Dr7;
- if ((Dr7.Bits.G0 == 1) &&
+ if ((Dr7.Bits.G0 == 1) &&
(Dr7.Bits.LEN0 == Length) &&
- (Dr7.Bits.RW0 == Type) &&
+ (Dr7.Bits.RW0 == Type) &&
(Address == SystemContext.SystemContextIa32->Dr0)) {
*Register = 0;
- } else if ((Dr7.Bits.G1 == 1) &&
+ } else if ((Dr7.Bits.G1 == 1) &&
(Dr7.Bits.LEN1 == Length) &&
- (Dr7.Bits.RW1 == Type) &&
+ (Dr7.Bits.RW1 == Type) &&
(Address == SystemContext.SystemContextIa32->Dr1)) {
*Register = 1;
- } else if ((Dr7.Bits.G2 == 1) &&
+ } else if ((Dr7.Bits.G2 == 1) &&
(Dr7.Bits.LEN2 == Length) &&
- (Dr7.Bits.RW2 == Type) &&
+ (Dr7.Bits.RW2 == Type) &&
(Address == SystemContext.SystemContextIa32->Dr2)) {
*Register = 2;
- } else if ((Dr7.Bits.G3 == 1) &&
+ } else if ((Dr7.Bits.G3 == 1) &&
(Dr7.Bits.LEN3 == Length) &&
- (Dr7.Bits.RW3 == Type) &&
+ (Dr7.Bits.RW3 == Type) &&
(Address == SystemContext.SystemContextIa32->Dr3)) {
*Register = 3;
} else {
@@ -884,15 +884,15 @@ RemoveBreakPoint ( }
switch (Type) {
-
+
case 0: //Software breakpoint
BreakType = SoftwareBreakpoint;
break;
-
+
case 1: //Hardware breakpoint
BreakType = InstructionExecution;
break;
-
+
case 2: //Write watchpoint
BreakType = DataWrite;
break;
@@ -954,8 +954,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
)
{
return TRUE;
|