TianoCore EDK2 master
|
#include <Uefi.h>
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/DebugLib.h>
#include <Library/UefiLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/PcdLib.h>
#include <Library/GdbSerialLib.h>
#include <Library/PrintLib.h>
#include <Protocol/DebugSupport.h>
#include <Protocol/SerialIo.h>
#include <Protocol/LoadedImage.h>
#include <Guid/DebugImageInfoTable.h>
#include <IndustryStandard/PeImage.h>
Go to the source code of this file.
Data Structures | |
struct | GDB_SERIAL_DEVICE_PATH |
struct | GDB_SERIAL_DEV |
struct | EFI_EXCEPTION_TYPE_ENTRY |
Macros | |
#define | MAX_BUF_SIZE 2000 |
#define | MAX_ADDR_SIZE 32 |
#define | MAX_REG_NUM_BUF_SIZE 32 |
#define | MAX_LENGTH_SIZE 32 |
#define | MAX_T_SIGNAL_SIZE 64 |
#define | TF_BIT 0x00000100 |
#define | GDB_SIGILL 4 |
#define | GDB_SIGTRAP 5 |
#define | GDB_SIGEMT 7 |
#define | GDB_SIGFPE 8 |
#define | GDB_SIGSEGV 11 |
#define | GDB_EBADMEMADDRBUFSIZE 11 |
#define | GDB_EBADMEMLENGBUFSIZE 12 |
#define | GDB_EBADMEMLENGTH 13 |
#define | GDB_EBADMEMDATA 14 |
#define | GDB_EBADMEMDATASIZE 15 |
#define | GDB_EBADBUFSIZE 21 |
#define | GDB_EINVALIDARG 31 |
#define | GDB_ENOSPACE 41 |
#define | GDB_EINVALIDBRKPOINTTYPE 51 |
#define | GDB_EINVALIDREGNUM 61 |
#define | GDB_EUNKNOWN 255 |
#define | GDB_STDIN 0x00 |
#define | GDB_STDOUT 0x01 |
#define | GDB_STDERR 0x02 |
#define | GDB_SERIAL_DEV_SIGNATURE SIGNATURE_32 ('g', 'd', 'b', 's') |
#define | GDB_SERIAL_DEV_FROM_THIS(a) CR (a, GDB_SERIAL_DEV, SerialIo, GDB_SERIAL_DEV_SIGNATURE) |
Enumerations | |
enum | BREAK_TYPE { InstructionExecution , DataWrite , DataRead , DataReadWrite , SoftwareBreakpoint , NotSupported } |
Variables | |
CONST CHAR8 | mHexToStr [] |
EFI_EXCEPTION_TYPE_ENTRY | gExceptionType [] |
BOOLEAN | gCtrlCBreakFlag |
BOOLEAN | gProcessingFPacket |
UINTN | gRegisterOffsets [] |
Private include file for GDB stub
Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
Definition in file GdbStubInternal.h.
#define GDB_EBADBUFSIZE 21 |
Definition at line 70 of file GdbStubInternal.h.
#define GDB_EBADMEMADDRBUFSIZE 11 |
Definition at line 65 of file GdbStubInternal.h.
#define GDB_EBADMEMDATA 14 |
Definition at line 68 of file GdbStubInternal.h.
#define GDB_EBADMEMDATASIZE 15 |
Definition at line 69 of file GdbStubInternal.h.
#define GDB_EBADMEMLENGBUFSIZE 12 |
Definition at line 66 of file GdbStubInternal.h.
#define GDB_EBADMEMLENGTH 13 |
Definition at line 67 of file GdbStubInternal.h.
#define GDB_EINVALIDARG 31 |
Definition at line 71 of file GdbStubInternal.h.
#define GDB_EINVALIDBRKPOINTTYPE 51 |
Definition at line 73 of file GdbStubInternal.h.
#define GDB_EINVALIDREGNUM 61 |
Definition at line 74 of file GdbStubInternal.h.
#define GDB_ENOSPACE 41 |
Definition at line 72 of file GdbStubInternal.h.
#define GDB_EUNKNOWN 255 |
Definition at line 75 of file GdbStubInternal.h.
#define GDB_SERIAL_DEV_FROM_THIS | ( | a | ) | CR (a, GDB_SERIAL_DEV, SerialIo, GDB_SERIAL_DEV_SIGNATURE) |
Definition at line 122 of file GdbStubInternal.h.
#define GDB_SERIAL_DEV_SIGNATURE SIGNATURE_32 ('g', 'd', 'b', 's') |
Definition at line 95 of file GdbStubInternal.h.
#define GDB_SIGEMT 7 |
Definition at line 57 of file GdbStubInternal.h.
#define GDB_SIGFPE 8 |
Definition at line 58 of file GdbStubInternal.h.
#define GDB_SIGILL 4 |
Definition at line 55 of file GdbStubInternal.h.
#define GDB_SIGSEGV 11 |
Definition at line 59 of file GdbStubInternal.h.
#define GDB_SIGTRAP 5 |
Definition at line 56 of file GdbStubInternal.h.
#define GDB_STDERR 0x02 |
Definition at line 82 of file GdbStubInternal.h.
#define GDB_STDIN 0x00 |
Definition at line 80 of file GdbStubInternal.h.
#define GDB_STDOUT 0x01 |
Definition at line 81 of file GdbStubInternal.h.
#define MAX_ADDR_SIZE 32 |
Definition at line 38 of file GdbStubInternal.h.
#define MAX_BUF_SIZE 2000 |
Definition at line 35 of file GdbStubInternal.h.
#define MAX_LENGTH_SIZE 32 |
Definition at line 44 of file GdbStubInternal.h.
#define MAX_REG_NUM_BUF_SIZE 32 |
Definition at line 41 of file GdbStubInternal.h.
#define MAX_T_SIGNAL_SIZE 64 |
Definition at line 47 of file GdbStubInternal.h.
#define TF_BIT 0x00000100 |
Definition at line 50 of file GdbStubInternal.h.
enum BREAK_TYPE |
Definition at line 185 of file GdbStubInternal.h.
VOID AddSingleStep | ( | IN EFI_SYSTEM_CONTEXT | SystemContext | ) |
Insert Single Step in the SystemContext
SystemContext | Register content at time of the exception |
Definition at line 386 of file Processor.c.
CHAR8 * BasicReadRegister | ( | IN EFI_SYSTEM_CONTEXT | SystemContext, |
IN UINTN | RegNumber, | ||
IN CHAR8 * | OutBufPtr | ||
) |
Adds the RegNumber-th register's value to the output buffer, starting at the given OutBufPtr
SystemContext | Register content at time of the exception |
RegNumber | the number of the register that we want to read |
OutBufPtr | pointer to the output buffer's end. the new data will be added from this point on. |
the | pointer to the next character of the output buffer that is available to be written on. |
Definition at line 144 of file Processor.c.
CHAR8 * BasicWriteRegister | ( | IN EFI_SYSTEM_CONTEXT | SystemContext, |
IN UINTN | RegNumber, | ||
IN CHAR8 * | InBufPtr | ||
) |
Adds the RegNumber-th register's value to the output buffer, starting at the given OutBufPtr
SystemContext | Register content at time of the exception |
RegNumber | the number of the register that we want to write |
InBufPtr | pointer to the output buffer. the new data will be extracted from the input buffer from this point on. |
the | pointer to the next character of the input buffer that can be used |
Definition at line 246 of file Processor.c.
BOOLEAN CheckIsa | ( | IN EFI_INSTRUCTION_SET_ARCHITECTURE | Isa | ) |
Check to see if the ISA is supported. ISA = Instruction Set Architecture
TRUE | if Isa is supported, FALSE otherwise. |
Check to see if the ISA is supported. ISA = Instruction Set Architecture
TRUE | if Isa is supported |
Definition at line 105 of file Processor.c.
VOID EFIAPI ContinueAtAddress | ( | IN EFI_SYSTEM_CONTEXT | SystemContext, |
IN CHAR8 * | PacketData | ||
) |
‘c [addr ]’ Continue. addr is Address to resume. If addr is omitted, resume at current Address.
SystemContext | Register content at time of the exception |
*PacketData | Pointer to PacketData |
Continue. addr is Address to resume. If addr is omitted, resume at current Address.
SystemContext | Register content at time of the exception |
‘c [addr ]’ Continue. addr is Address to resume. If addr is omitted, resume at current Address.
SystemContext | Register content at time of the exception |
Definition at line 444 of file Processor.c.
UINT8 ConvertEFItoGDBtype | ( | IN EFI_EXCEPTION_TYPE | EFIExceptionType | ) |
Parses Length and returns the length which DR7 LENn field accepts. For example: If we receive 1-Byte length then we should return 0. Zero gets written to DR7 LENn field.
Length | Breakpoint length in Bytes (1 byte, 2 byte, 4 byte) |
Length | Appropriate converted values which DR7 LENn field accepts. |
Definition at line 530 of file Processor.c.
EFI_STATUS DisableDebugRegister | ( | IN EFI_SYSTEM_CONTEXT | SystemContext, |
IN UINTN | Register | ||
) |
Disables the particular debug register.
SystemContext | Register content at time of the exception |
Register | Register to be disabled |
EFI_STATUS | Appropriate status value. |
Definition at line 740 of file Processor.c.
VOID EmptyBuffer | ( | IN CHAR8 * | Buf | ) |
EFI_STATUS EnableDebugRegister | ( | IN EFI_SYSTEM_CONTEXT | SystemContext, |
IN UINTN | Register, | ||
IN UINTN | Address, | ||
IN UINTN | Length, | ||
IN UINTN | Type | ||
) |
Enables the debug register. Writes Address value to appropriate DR0-3 register. Sets LENn, Gn, RWn bits in DR7 register.
SystemContext | Register content at time of the exception |
Register | Register value (0 - 3) |
Address | Breakpoint address value |
Type | Breakpoint type (Instruction, Data write, Data read or write etc.) |
EFI_STATUS | Appropriate status value. |
Definition at line 598 of file Processor.c.
EFI_STATUS FindMatchingDebugRegister | ( | IN EFI_SYSTEM_CONTEXT | SystemContext, |
IN UINTN | Address, | ||
IN UINTN | Length, | ||
IN UINTN | Type, | ||
OUT UINTN * | Register | ||
) |
Returns register number 0 - 3 for the matching 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.
SystemContext | Register content at time of the exception |
Address | Breakpoint address value |
Length | Breakpoint length value |
Type | Breakpoint type (Instruction, Data write, Data read or write etc.) |
Register | Register value to be returned |
EFI_STATUS | Appropriate status value. |
Definition at line 675 of file Processor.c.
EFI_STATUS FindNextFreeDebugRegister | ( | IN EFI_SYSTEM_CONTEXT | SystemContext, |
OUT UINTN * | Register | ||
) |
Finds the next free debug register. If all the registers are occupied then EFI_OUT_OF_RESOURCES is returned.
SystemContext | Register content at time of the exception |
Register | Register value (0 - 3 for the first free debug register) |
EFI_STATUS | Appropriate status value. |
Definition at line 560 of file Processor.c.
UINTN * FindPointerToRegister | ( | IN EFI_SYSTEM_CONTEXT | SystemContext, |
IN UINTN | RegNumber | ||
) |
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
SystemContext | Register content at time of the exception |
RegNumber | The register to which we want to find a pointer |
the | pointer to the RegNumber-th pointer |
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
SystemContext | Register content at time of the exception |
RegNumber | The register to which we want to find a pointer |
the | pointer to the RegNumber-th pointer |
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
SystemContext | Register content at time of the exception |
RegNumber | The register to which we want to find a pointer |
the | pointer to the RegNumber-th pointer |
Definition at line 124 of file Processor.c.
VOID EFIAPI GdbExceptionHandler | ( | IN EFI_EXCEPTION_TYPE | ExceptionType, |
IN OUT EFI_SYSTEM_CONTEXT | SystemContext | ||
) |
VOID GdbInitializeSerialConsole | ( | VOID | ) |
Make two serial consoles: 1) StdIn and StdOut via GDB. 2) StdErr via GDB.
These console show up on the remote system running GDB
Definition at line 498 of file SerialIo.c.
VOID EFIAPI GdbPeriodicCallBack | ( | IN OUT EFI_SYSTEM_CONTEXT | SystemContext | ) |
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.
FileDescriptor | Device to talk to. |
Buffer | Buffer to hold Count bytes that were read |
Count | Number of bytes to transfer. |
-1 | Error |
{other} | Number of bytes read. |
Definition at line 115 of file SerialIo.c.
VOID GdbSendTSignal | ( | IN EFI_SYSTEM_CONTEXT | SystemContext, |
IN UINT8 | GdbExceptionType | ||
) |
Write data to a FileDescriptor. On success number of bytes written is returned. Zero indicates nothing was written. On error -1 is returned.
FileDescriptor | Device to talk to. |
Buffer | Buffer to hold Count bytes that are to be written |
Count | Number of bytes to transfer. |
-1 | Error |
{other} | Number of bytes written. |
Definition at line 197 of file SerialIo.c.
UINTN GetBreakpointDataAddress | ( | IN EFI_SYSTEM_CONTEXT | SystemContext, |
IN UINTN | BreakpointNumber | ||
) |
Returns breakpoint data address from DR0-DR3 based on the input breakpoint number
SystemContext | Register content at time of the exception |
BreakpointNumber | Breakpoint number |
Address | Data address from DR0-DR3 based on the breakpoint number. |
Definition at line 471 of file Processor.c.
UINTN GetBreakpointDetected | ( | IN EFI_SYSTEM_CONTEXT | SystemContext | ) |
Returns currently detected breakpoint value based on the register DR6 B0-B3 field. If no breakpoint is detected then it returns 0.
SystemContext | Register content at time of the exception |
{1-4} | Currently detected breakpoint value |
0 | No breakpoint detected. |
Definition at line 480 of file Processor.c.
BREAK_TYPE GetBreakpointType | ( | IN EFI_SYSTEM_CONTEXT | SystemContext, |
IN UINTN | BreakpointNumber | ||
) |
Returns Breakpoint type (InstructionExecution, DataWrite, DataRead or DataReadWrite) based on the Breakpoint number
SystemContext | Register content at time of the exception |
BreakpointNumber | Breakpoint number |
BREAK_TYPE | Breakpoint type value read from register DR7 RWn field For unknown value, it returns NotSupported. |
Returns Breakpoint type (InstructionExecution, DataWrite, DataRead or DataReadWrite) based on the Breakpoint number
SystemContext | Register content at time of the exception |
BreakpointNumber | Breakpoint number |
BREAK_TYPE | Breakpoint type value read from register DR7 RWn field. For unknown value, it returns NotSupported. |
Definition at line 488 of file Processor.c.
Converts an 8-bit Hex Char into a INTN.
Char | - the hex character to be converted into UINTN |
a | INTN, from 0 to 15, that corresponds to Char -1 if Char is not a hex character |
Converts an 8-bit Hex Char into a INTN.
Char | the hex character to be converted into UINTN |
a | INTN, from 0 to 15, that corresponds to Char -1 if Char is not a hex character |
VOID InitializeProcessor | ( | VOID | ) |
Definition at line 640 of file Processor.c.
VOID EFIAPI InsertBreakPoint | ( | IN EFI_SYSTEM_CONTEXT | SystemContext, |
IN CHAR8 * | PacketData | ||
) |
‘Z1, [addr], [length]’ ‘Z2, [addr], [length]’ ‘Z3, [addr], [length]’ ‘Z4, [addr], [length]’
Insert hardware breakpoint/watchpoint at address addr of size length
SystemContext | Register content at time of the exception |
*PacketData | Pointer to the Payload data for the packet |
Definition at line 575 of file Processor.c.
UINTN MaxEfiException | ( | VOID | ) |
Return the number of entries in the gExceptionType[]
UINTN,the | number of entries in the gExceptionType[] array. |
Definition at line 77 of file Processor.c.
UINTN MaxRegisterCount | ( | VOID | ) |
Return the number of entries in the gRegisters[]
UINTN,the | number of entries (registers) in the gRegisters[] array. |
Definition at line 90 of file Processor.c.
UINTN ParseBreakpointPacket | ( | IN CHAR8 * | PacketData, |
OUT UINTN * | Type, | ||
OUT UINTN * | Address, | ||
OUT UINTN * | Length | ||
) |
Parses breakpoint packet data and captures Breakpoint type, Address and length. In case of an error, function returns particular error code. Returning 0 meaning no error.
PacketData | Pointer to the payload data for the packet. |
Type | Breakpoint type |
Address | Breakpoint address |
Length | Breakpoint length in Bytes (1 byte, 2 byte, 4 byte) |
1 | Success |
{other} | Particular error code |
VOID EFIAPI ReadFromMemory | ( | IN CHAR8 * | PacketData | ) |
‘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 send it as a packet.
*PacketData | Pointer to Payload data for the packet |
VOID EFIAPI ReadGeneralRegisters | ( | IN EFI_SYSTEM_CONTEXT | SystemContext | ) |
‘g’ Reads the general registers into an output buffer and sends it as a packet
SystemContext | Register content at time of the exception |
Reads the general registers into an output buffer and sends it as a packet
SystemContext | Register content at time of the exception |
Definition at line 216 of file Processor.c.
VOID ReadNthRegister | ( | IN EFI_SYSTEM_CONTEXT | SystemContext, |
IN CHAR8 * | InBuffer | ||
) |
‘p n’ Reads the n-th register's value into an output buffer and sends it as a packet
SystemContext | Register content at time of the exception |
InBuffer | This is the input buffer received from gdb server |
Reads the n-th register's value into an output buffer and sends it as a packet
SystemContext | Register content at time of the exception |
InBuffer | Pointer to the input buffer received from gdb server |
‘p n’ Reads the n-th register's value into an output buffer and sends it as a packet
SystemContext | Register content at time of the exception |
InBuffer | Pointer to the input buffer received from gdb server |
Definition at line 187 of file Processor.c.
Receive a GDB Remote Serial Protocol Packet
$PacketData::checksum PacketData is passed in and this function adds the packet prefix '$', the packet terminating character '#' and the two digit checksum.
If host re-starts sending a packet without ending the previous packet, only the last valid packet is processed. (In other words, if received packet is '$12345$12345$123456::checksum', only '$123456::checksum' will be processed.)
If an ack '+' is not sent resend the packet
PacketData | Payload data for the packet |
Number | of bytes of packet data received. |
VOID EFIAPI RemoveBreakPoint | ( | IN EFI_SYSTEM_CONTEXT | SystemContext, |
IN CHAR8 * | PacketData | ||
) |
‘z1, [addr], [length]’ ‘z2, [addr], [length]’ ‘z3, [addr], [length]’ ‘z4, [addr], [length]’
Remove hardware breakpoint/watchpoint at address addr of size length
SystemContext | Register content at time of the exception |
*PacketData | Pointer to the Payload data for the packet |
‘z1, [addr], [length]’ ‘z2, [addr], [length]’ ‘z3, [addr], [length]’ ‘z4, [addr], [length]’
Remove hardware breakpoint/watchpoint at address addr of size length
*PacketData | Pointer to the Payload data for the packet |
Definition at line 608 of file Processor.c.
VOID RemoveSingleStep | ( | IN EFI_SYSTEM_CONTEXT | SystemContext | ) |
Remove Single Step in the SystemContext
SystemContext | Register content at time of the exception |
Definition at line 417 of file Processor.c.
VOID EFIAPI SendError | ( | IN UINT8 | ErrorNum | ) |
VOID EFIAPI SendNotSupported | ( | VOID | ) |
Send a GDB Remote Serial Protocol Packet
$PacketData::checksum PacketData is passed in and this function adds the packet prefix '$', the packet terminating character '#' and the two digit checksum.
If an ack '+' is not sent resend the packet, but timeout eventually so we don't end up in an infinite loop. This is so if you unplug the debugger code just keeps running
PacketData | Payload data for the packet |
Number | of bytes of packet data sent. |
VOID EFIAPI SendSuccess | ( | VOID | ) |
VOID EFIAPI SingleStep | ( | 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.
SystemContext | Register content at time of the exception |
PacketData | Pointer to Payload data for the packet |
‘s [addr ]’ Single step. addr is the Address at which to resume. If addr is omitted, resume at same Address.
SystemContext | Register content at time of the exception |
Definition at line 462 of file Processor.c.
Transfer Length bytes of memory starting at Address to an output buffer, OutBuffer. This function will finally send the buffer as a packet.
Length | the number of the bytes to be transferred/read |
*address | pointer to the start address of the transferring/reading the memory |
BOOLEAN ValidateAddress | ( | IN VOID * | Address | ) |
Definition at line 649 of file Processor.c.
BOOLEAN ValidateException | ( | IN EFI_EXCEPTION_TYPE | ExceptionType, |
IN OUT EFI_SYSTEM_CONTEXT | SystemContext | ||
) |
Definition at line 661 of file Processor.c.
VOID EFIAPI WriteGeneralRegisters | ( | IN EFI_SYSTEM_CONTEXT | SystemContext, |
IN CHAR8 * | InBuffer | ||
) |
‘G XX...’ Writes the new values received into the input buffer to the general registers
SystemContext | Register content at time of the exception |
InBuffer | Pointer to the input buffer received from gdb server |
pointer to the input buffer
pointer to the input buffer
pointer to the input buffer
Definition at line 330 of file Processor.c.
VOID EFIAPI WriteNthRegister | ( | IN EFI_SYSTEM_CONTEXT | SystemContext, |
IN CHAR8 * | InBuffer | ||
) |
‘P n...=r...’ Writes the new value of n-th register received into the input buffer to the n-th register
SystemContext | Register content at time of the exception |
InBuffer | This is the input buffer received from gdb server |
‘P n...=r...’ Writes the new value of n-th register received into the input buffer to the n-th register
SystemContext | Register content at time of the exception |
InBuffer | Pointer to the input buffer received from gdb server |
Definition at line 292 of file Processor.c.
VOID EFIAPI WriteToMemory | ( | 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 the input buffer.
PacketData | Pointer to Payload data for the packet |
"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 the input buffer.
pointer to the input buffer
|
extern |
Definition at line 21 of file SerialIo.c.
|
extern |
Definition at line 18 of file Processor.c.
|
extern |
Definition at line 28 of file SerialIo.c.
|
extern |
Definition at line 26 of file Processor.c.