Vishal Bhoj | 82c8071 | 2015-12-15 21:13:33 +0530 | [diff] [blame] | 1 | /** @file
|
| 2 | Private include file for GDB stub
|
| 3 |
|
| 4 | Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
|
| 5 |
|
| 6 | This program and the accompanying materials
|
| 7 | are licensed and made available under the terms and conditions of the BSD License
|
| 8 | which accompanies this distribution. The full text of the license may be found at
|
| 9 | http://opensource.org/licenses/bsd-license.php
|
| 10 |
|
| 11 | THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
| 12 | WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
| 13 |
|
| 14 | **/
|
| 15 |
|
| 16 | #ifndef __GDB_STUB_INTERNAL__
|
| 17 | #define __GDB_STUB_INTERNAL__
|
| 18 |
|
| 19 | #include <Uefi.h>
|
| 20 | #include <Library/BaseLib.h>
|
| 21 | #include <Library/BaseMemoryLib.h>
|
| 22 | #include <Library/MemoryAllocationLib.h>
|
| 23 | #include <Library/DebugLib.h>
|
| 24 | #include <Library/UefiLib.h>
|
| 25 | #include <Library/UefiBootServicesTableLib.h>
|
| 26 | #include <Library/PcdLib.h>
|
| 27 | #include <Library/GdbSerialLib.h>
|
| 28 | #include <Library/PrintLib.h>
|
| 29 |
|
| 30 | #include <Protocol/DebugSupport.h>
|
| 31 | #include <Protocol/SerialIo.h>
|
| 32 | #include <Protocol/LoadedImage.h>
|
| 33 | #include <Protocol/LoadedImage.h>
|
| 34 | #include <Guid/DebugImageInfoTable.h>
|
| 35 | #include <IndustryStandard/PeImage.h>
|
| 36 |
|
| 37 | extern CONST CHAR8 mHexToStr[];
|
| 38 |
|
| 39 | // maximum size of input and output buffers
|
| 40 | // This value came from the show remote command of the gdb we tested against
|
| 41 | #define MAX_BUF_SIZE 2000
|
| 42 |
|
| 43 | // maximum size of address buffer
|
| 44 | #define MAX_ADDR_SIZE 32
|
| 45 |
|
| 46 | // maximum size of register number buffer
|
| 47 | #define MAX_REG_NUM_BUF_SIZE 32
|
| 48 |
|
| 49 | // maximum size of length buffer
|
| 50 | #define MAX_LENGTH_SIZE 32
|
| 51 |
|
| 52 | // maximum size of T signal members
|
| 53 | #define MAX_T_SIGNAL_SIZE 64
|
| 54 |
|
| 55 | // the mask used to clear all the cache
|
| 56 | #define TF_BIT 0x00000100
|
| 57 |
|
| 58 |
|
| 59 | //
|
| 60 | // GDB Signal definitions - generic names for interrupts
|
| 61 | //
|
| 62 | #define GDB_SIGILL 4 // Illegal instruction
|
| 63 | #define GDB_SIGTRAP 5 // Trace Trap (Breakpoint and SingleStep)
|
| 64 | #define GDB_SIGEMT 7 // Emulator Trap
|
| 65 | #define GDB_SIGFPE 8 // Floating point exception
|
| 66 | #define GDB_SIGSEGV 11 // Segment violation, page fault
|
| 67 |
|
| 68 |
|
| 69 | //
|
| 70 | // GDB File I/O Error values, zero means no error
|
| 71 | // Includes all general GDB Unix like error values
|
| 72 | //
|
| 73 | #define GDB_EBADMEMADDRBUFSIZE 11 // the buffer that stores memory Address to be read from/written to is not the right size
|
| 74 | #define GDB_EBADMEMLENGBUFSIZE 12 // the buffer that stores Length is not the right size
|
| 75 | #define GDB_EBADMEMLENGTH 13 // Length, the given number of bytes to read or write, is not the right size
|
| 76 | #define GDB_EBADMEMDATA 14 // one of the bytes or nibbles of the memory is leess than 0
|
| 77 | #define GDB_EBADMEMDATASIZE 15 // the memory data, 'XX..', is too short or too long
|
| 78 | #define GDB_EBADBUFSIZE 21 // the buffer created is not the correct size
|
| 79 | #define GDB_EINVALIDARG 31 // argument is invalid
|
| 80 | #define GDB_ENOSPACE 41 //
|
| 81 | #define GDB_EINVALIDBRKPOINTTYPE 51 // the breakpoint type is not recognized
|
| 82 | #define GDB_EINVALIDREGNUM 61 // given register number is not valid: either <0 or >=Number of Registers
|
| 83 | #define GDB_EUNKNOWN 255 // unknown
|
| 84 |
|
| 85 |
|
| 86 | //
|
| 87 | // These devices are open by GDB so we can just read and write to them
|
| 88 | //
|
| 89 | #define GDB_STDIN 0x00
|
| 90 | #define GDB_STDOUT 0x01
|
| 91 | #define GDB_STDERR 0x02
|
| 92 |
|
| 93 | //
|
| 94 | //Define Register size for different architectures
|
| 95 | //
|
| 96 | #if defined (MDE_CPU_IA32)
|
| 97 | #define REG_SIZE 32
|
| 98 | #elif defined (MDE_CPU_X64)
|
| 99 | #define REG_SIZE 64
|
| 100 | #elif defined (MDE_CPU_ARM)
|
| 101 | #define REG_SIZE 32
|
| 102 | #endif
|
| 103 |
|
| 104 | #define GDB_SERIAL_DEV_SIGNATURE SIGNATURE_32 ('g', 'd', 'b', 's')
|
| 105 |
|
| 106 | typedef struct {
|
| 107 | VENDOR_DEVICE_PATH VendorDevice;
|
| 108 | UINT32 Index; // Suport more than one
|
| 109 | EFI_DEVICE_PATH_PROTOCOL End;
|
| 110 | } GDB_SERIAL_DEVICE_PATH;
|
| 111 |
|
| 112 | //
|
| 113 | // Name: SERIAL_DEV
|
| 114 | // Purpose: To provide device specific information
|
| 115 | // Fields:
|
| 116 | // Signature UINTN: The identity of the serial device
|
| 117 | // SerialIo SERIAL_IO_PROTOCOL: Serial I/O protocol interface
|
| 118 | // SerialMode SERIAL_IO_MODE:
|
| 119 | // DevicePath EFI_DEVICE_PATH_PROTOCOL *: Device path of the serial device
|
| 120 | //
|
| 121 | typedef struct {
|
| 122 | UINTN Signature;
|
| 123 | EFI_HANDLE Handle;
|
| 124 | EFI_SERIAL_IO_PROTOCOL SerialIo;
|
| 125 | EFI_SERIAL_IO_MODE SerialMode;
|
| 126 | GDB_SERIAL_DEVICE_PATH DevicePath;
|
| 127 | INTN InFileDescriptor;
|
| 128 | INTN OutFileDescriptor;
|
| 129 | } GDB_SERIAL_DEV;
|
| 130 |
|
| 131 |
|
| 132 | #define GDB_SERIAL_DEV_FROM_THIS(a) CR (a, GDB_SERIAL_DEV, SerialIo, GDB_SERIAL_DEV_SIGNATURE)
|
| 133 |
|
| 134 |
|
| 135 | typedef struct {
|
| 136 | EFI_EXCEPTION_TYPE Exception;
|
| 137 | UINT8 SignalNo;
|
| 138 | } EFI_EXCEPTION_TYPE_ENTRY;
|
| 139 |
|
| 140 |
|
| 141 | #if defined (MDE_CPU_IA32) || defined (MDE_CPU_X64)
|
| 142 |
|
| 143 | //
|
| 144 | // Byte packed structure for DR6
|
| 145 | // 32-bits on IA-32
|
| 146 | // 64-bits on X64. The upper 32-bits on X64 are reserved
|
| 147 | //
|
| 148 | typedef union {
|
| 149 | struct {
|
| 150 | UINT32 B0:1; // Breakpoint condition detected
|
| 151 | UINT32 B1:1; // Breakpoint condition detected
|
| 152 | UINT32 B2:1; // Breakpoint condition detected
|
| 153 | UINT32 B3:1; // Breakpoint condition detected
|
| 154 | UINT32 Reserved_1:9; // Reserved
|
| 155 | UINT32 BD:1; // Debug register access detected
|
| 156 | UINT32 BS:1; // Single step
|
| 157 | UINT32 BT:1; // Task switch
|
| 158 | UINT32 Reserved_2:16; // Reserved
|
| 159 | } Bits;
|
| 160 | UINTN UintN;
|
| 161 | } IA32_DR6;
|
| 162 |
|
| 163 | //
|
| 164 | // Byte packed structure for DR7
|
| 165 | // 32-bits on IA-32
|
| 166 | // 64-bits on X64. The upper 32-bits on X64 are reserved
|
| 167 | //
|
| 168 | typedef union {
|
| 169 | struct {
|
| 170 | UINT32 L0:1; // Local breakpoint enable
|
| 171 | UINT32 G0:1; // Global breakpoint enable
|
| 172 | UINT32 L1:1; // Local breakpoint enable
|
| 173 | UINT32 G1:1; // Global breakpoint enable
|
| 174 | UINT32 L2:1; // Local breakpoint enable
|
| 175 | UINT32 G2:1; // Global breakpoint enable
|
| 176 | UINT32 L3:1; // Local breakpoint enable
|
| 177 | UINT32 G3:1; // Global breakpoint enable
|
| 178 | UINT32 LE:1; // Local exact breakpoint enable
|
| 179 | UINT32 GE:1; // Global exact breakpoint enable
|
| 180 | UINT32 Reserved_1:3; // Reserved
|
| 181 | UINT32 GD:1; // Global detect enable
|
| 182 | UINT32 Reserved_2:2; // Reserved
|
| 183 | UINT32 RW0:2; // Read/Write field
|
| 184 | UINT32 LEN0:2; // Length field
|
| 185 | UINT32 RW1:2; // Read/Write field
|
| 186 | UINT32 LEN1:2; // Length field
|
| 187 | UINT32 RW2:2; // Read/Write field
|
| 188 | UINT32 LEN2:2; // Length field
|
| 189 | UINT32 RW3:2; // Read/Write field
|
| 190 | UINT32 LEN3:2; // Length field
|
| 191 | } Bits;
|
| 192 | UINTN UintN;
|
| 193 | } IA32_DR7;
|
| 194 |
|
| 195 | #endif /* if defined (MDE_CPU_IA32) || defined (MDE_CPU_X64) */
|
| 196 |
|
| 197 | typedef enum {
|
| 198 | InstructionExecution, //Hardware breakpoint
|
| 199 | DataWrite, //watch
|
| 200 | DataRead, //rwatch
|
| 201 | DataReadWrite, //awatch
|
| 202 | SoftwareBreakpoint, //Software breakpoint
|
| 203 | NotSupported
|
| 204 | } BREAK_TYPE;
|
| 205 |
|
| 206 | //
|
| 207 | // Array of exception types that need to be hooked by the debugger
|
| 208 | //
|
| 209 | extern EFI_EXCEPTION_TYPE_ENTRY gExceptionType[];
|
| 210 |
|
| 211 | //
|
| 212 | // Set TRUE if F Reply package signals a ctrl-c. We can not process the Ctrl-c
|
| 213 | // here we need to wait for the periodic callback to do this.
|
| 214 | //
|
| 215 | extern BOOLEAN gCtrlCBreakFlag;
|
| 216 |
|
| 217 | //
|
| 218 | // If the periodic callback is called while we are processing an F packet we need
|
| 219 | // to let the callback know to not read from the serail stream as it could steal
|
| 220 | // characters from the F reponse packet
|
| 221 | //
|
| 222 | extern BOOLEAN gProcessingFPacket;
|
| 223 |
|
| 224 |
|
| 225 | // The offsets of registers SystemContext.
|
| 226 | // The fields in the array are in the gdb ordering.
|
| 227 | //
|
| 228 | extern UINTN gRegisterOffsets[];
|
| 229 |
|
| 230 | /**
|
| 231 | Return the number of entries in the gExceptionType[]
|
| 232 |
|
| 233 | @retval UINTN, the number of entries in the gExceptionType[] array.
|
| 234 | **/
|
| 235 | UINTN
|
| 236 | MaxEfiException (
|
| 237 | VOID
|
| 238 | );
|
| 239 |
|
| 240 |
|
| 241 | /**
|
| 242 | Return the number of entries in the gRegisters[]
|
| 243 |
|
| 244 | @retval UINTN, the number of entries (registers) in the gRegisters[] array.
|
| 245 | **/
|
| 246 | UINTN
|
| 247 | MaxRegisterCount (
|
| 248 | VOID
|
| 249 | );
|
| 250 |
|
| 251 |
|
| 252 | /**
|
| 253 | Check to see if the ISA is supported.
|
| 254 | ISA = Instruction Set Architecture
|
| 255 |
|
| 256 | @retval TRUE if Isa is supported,
|
| 257 | FALSE otherwise.
|
| 258 | **/
|
| 259 | BOOLEAN
|
| 260 | CheckIsa (
|
| 261 | IN EFI_INSTRUCTION_SET_ARCHITECTURE Isa
|
| 262 | );
|
| 263 |
|
| 264 |
|
| 265 | /**
|
| 266 | Send the T signal with the given exception type (in gdb order) and possibly with n:r pairs related to the watchpoints
|
| 267 |
|
| 268 | @param SystemContext Register content at time of the exception
|
| 269 | @param GdbExceptionType GDB exception type
|
| 270 | **/
|
| 271 |
|
| 272 | VOID
|
| 273 | GdbSendTSignal (
|
| 274 | IN EFI_SYSTEM_CONTEXT SystemContext,
|
| 275 | IN UINT8 GdbExceptionType
|
| 276 | );
|
| 277 |
|
| 278 |
|
| 279 | /**
|
| 280 | Translates the EFI mapping to GDB mapping
|
| 281 |
|
| 282 | @param EFIExceptionType EFI Exception that is being processed
|
| 283 | @retval UINTN that corresponds to EFIExceptionType's GDB exception type number
|
| 284 | **/
|
| 285 | UINT8
|
| 286 | ConvertEFItoGDBtype (
|
| 287 | IN EFI_EXCEPTION_TYPE EFIExceptionType
|
| 288 | );
|
| 289 |
|
| 290 |
|
| 291 | /**
|
| 292 | Empties the given buffer
|
| 293 | @param *Buf pointer to the first element in buffer to be emptied
|
| 294 | **/
|
| 295 | VOID
|
| 296 | EmptyBuffer (
|
| 297 | IN CHAR8 *Buf
|
| 298 | );
|
| 299 |
|
| 300 |
|
| 301 | /**
|
| 302 | Converts an 8-bit Hex Char into a INTN.
|
| 303 |
|
| 304 | @param Char - the hex character to be converted into UINTN
|
| 305 | @retval a INTN, from 0 to 15, that corressponds to Char
|
| 306 | -1 if Char is not a hex character
|
| 307 | **/
|
| 308 | INTN
|
| 309 | HexCharToInt (
|
| 310 | IN CHAR8 Char
|
| 311 | );
|
| 312 |
|
| 313 |
|
| 314 | /** 'E NN'
|
| 315 | Send an error with the given error number after converting to hex.
|
| 316 | The error number is put into the buffer in hex. '255' is the biggest errno we can send.
|
| 317 | ex: 162 will be sent as A2.
|
| 318 |
|
| 319 | @param errno the error number that will be sent
|
| 320 | **/
|
| 321 | VOID
|
| 322 | EFIAPI
|
| 323 | SendError (
|
| 324 | IN UINT8 ErrorNum
|
| 325 | );
|
| 326 |
|
| 327 |
|
| 328 | /**
|
| 329 | Send 'OK' when the function is done executing successfully.
|
| 330 | **/
|
| 331 | VOID
|
| 332 | SendSuccess (
|
| 333 | VOID
|
| 334 | );
|
| 335 |
|
| 336 |
|
| 337 | /**
|
| 338 | Send empty packet to specify that particular command/functionality is not supported.
|
| 339 | **/
|
| 340 | VOID
|
| 341 | SendNotSupported (
|
| 342 | VOID
|
| 343 | );
|
| 344 |
|
| 345 | /** ‘p n’
|
| 346 | Reads the n-th register's value into an output buffer and sends it as a packet
|
| 347 | @param SystemContext Register content at time of the exception
|
| 348 | @param InBuffer This is the input buffer received from gdb server
|
| 349 | **/
|
| 350 | VOID
|
| 351 | ReadNthRegister (
|
| 352 | IN EFI_SYSTEM_CONTEXT SystemContext,
|
| 353 | IN CHAR8 *InBuffer
|
| 354 | );
|
| 355 |
|
| 356 |
|
| 357 | /** ‘g’
|
| 358 | Reads the general registers into an output buffer and sends it as a packet
|
| 359 | @param SystemContext Register content at time of the exception
|
| 360 | **/
|
| 361 | VOID
|
| 362 | ReadGeneralRegisters (
|
| 363 | IN EFI_SYSTEM_CONTEXT SystemContext
|
| 364 | );
|
| 365 |
|
| 366 |
|
| 367 | /** ‘P n...=r...’
|
| 368 | Writes the new value of n-th register received into the input buffer to the n-th register
|
| 369 | @param SystemContext Register content at time of the exception
|
| 370 | @param InBuffer This is the input buffer received from gdb server
|
| 371 | **/
|
| 372 | VOID
|
| 373 | WriteNthRegister (
|
| 374 | IN EFI_SYSTEM_CONTEXT SystemContext,
|
| 375 | IN CHAR8 *InBuffer
|
| 376 | );
|
| 377 |
|
| 378 |
|
| 379 | /** ‘G XX...’
|
| 380 | Writes the new values received into the input buffer to the general registers
|
| 381 | @param SystemContext Register content at time of the exception
|
| 382 | @param InBuffer Pointer to the input buffer received from gdb server
|
| 383 | **/
|
| 384 |
|
| 385 | VOID
|
| 386 | WriteGeneralRegisters (
|
| 387 | IN EFI_SYSTEM_CONTEXT SystemContext,
|
| 388 | IN CHAR8 *InBuffer
|
| 389 | );
|
| 390 |
|
| 391 |
|
| 392 | /** ‘m addr,length ’
|
| 393 | Find the Length of the area to read and the start addres. Finally, pass them to
|
| 394 | another function, TransferFromMemToOutBufAndSend, that will read from that memory space and
|
| 395 | send it as a packet.
|
| 396 |
|
| 397 | @param *PacketData Pointer to Payload data for the packet
|
| 398 | **/
|
| 399 | VOID
|
| 400 | ReadFromMemory (
|
| 401 | IN CHAR8 *PacketData
|
| 402 | );
|
| 403 |
|
| 404 |
|
| 405 | /** ‘M addr,length :XX...’
|
| 406 | Find the Length of the area in bytes to write and the start addres. Finally, pass them to
|
| 407 | another function, TransferFromInBufToMem, that will write to that memory space the info in
|
| 408 | the input buffer.
|
| 409 |
|
| 410 | @param PacketData Pointer to Payload data for the packet
|
| 411 | **/
|
| 412 | VOID
|
| 413 | WriteToMemory (
|
| 414 | IN CHAR8 *PacketData
|
| 415 | );
|
| 416 |
|
| 417 |
|
| 418 | /** ‘c [addr ]’
|
| 419 | Continue. addr is Address to resume. If addr is omitted, resume at current
|
| 420 | Address.
|
| 421 |
|
| 422 | @param SystemContext Register content at time of the exception
|
| 423 | @param *PacketData Pointer to PacketData
|
| 424 | **/
|
| 425 |
|
| 426 | VOID
|
| 427 | ContinueAtAddress (
|
| 428 | IN EFI_SYSTEM_CONTEXT SystemContext,
|
| 429 | IN CHAR8 *PacketData
|
| 430 | );
|
| 431 |
|
| 432 |
|
| 433 | /** ‘s [addr ]’
|
| 434 | Single step. addr is the Address at which to resume. If addr is omitted, resume
|
| 435 | at same Address.
|
| 436 |
|
| 437 | @param SystemContext Register content at time of the exception
|
| 438 | @param PacketData Pointer to Payload data for the packet
|
| 439 | **/
|
| 440 | VOID
|
| 441 | SingleStep (
|
| 442 | IN EFI_SYSTEM_CONTEXT SystemContext,
|
| 443 | IN CHAR8 *PacketData
|
| 444 | );
|
| 445 |
|
| 446 | /**
|
| 447 | Insert Single Step in the SystemContext
|
| 448 |
|
| 449 | @param SystemContext Register content at time of the exception
|
| 450 | **/
|
| 451 | VOID
|
| 452 | AddSingleStep (
|
| 453 | IN EFI_SYSTEM_CONTEXT SystemContext
|
| 454 | );
|
| 455 |
|
| 456 | /**
|
| 457 | Remove Single Step in the SystemContext
|
| 458 |
|
| 459 | @param SystemContext Register content at time of the exception
|
| 460 | **/
|
| 461 | VOID
|
| 462 | RemoveSingleStep (
|
| 463 | IN EFI_SYSTEM_CONTEXT SystemContext
|
| 464 | );
|
| 465 |
|
| 466 |
|
| 467 | /**
|
| 468 | ‘Z1, [addr], [length]’
|
| 469 | ‘Z2, [addr], [length]’
|
| 470 | ‘Z3, [addr], [length]’
|
| 471 | ‘Z4, [addr], [length]’
|
| 472 |
|
| 473 | Insert hardware breakpoint/watchpoint at address addr of size length
|
| 474 |
|
| 475 | @param SystemContext Register content at time of the exception
|
| 476 | @param *PacketData Pointer to the Payload data for the packet
|
| 477 |
|
| 478 | **/
|
| 479 | VOID
|
| 480 | EFIAPI
|
| 481 | InsertBreakPoint(
|
| 482 | IN EFI_SYSTEM_CONTEXT SystemContext,
|
| 483 | IN CHAR8 *PacketData
|
| 484 | );
|
| 485 |
|
| 486 |
|
| 487 | /**
|
| 488 | ‘z1, [addr], [length]’
|
| 489 | ‘z2, [addr], [length]’
|
| 490 | ‘z3, [addr], [length]’
|
| 491 | ‘z4, [addr], [length]’
|
| 492 |
|
| 493 | Remove hardware breakpoint/watchpoint at address addr of size length
|
| 494 |
|
| 495 | @param SystemContext Register content at time of the exception
|
| 496 | @param *PacketData Pointer to the Payload data for the packet
|
| 497 |
|
| 498 | **/
|
| 499 | VOID
|
| 500 | EFIAPI
|
| 501 | RemoveBreakPoint(
|
| 502 | IN EFI_SYSTEM_CONTEXT SystemContext,
|
| 503 | IN CHAR8 *PacketData
|
| 504 | );
|
| 505 |
|
| 506 |
|
| 507 | /**
|
| 508 | Exception Hanldler for GDB. It will be called for all exceptions
|
| 509 | registered via the gExceptionType[] array.
|
| 510 |
|
| 511 | @param ExceptionType Exception that is being processed
|
| 512 | @param SystemContext Register content at time of the exception
|
| 513 |
|
| 514 | **/
|
| 515 | VOID
|
| 516 | EFIAPI
|
| 517 | GdbExceptionHandler (
|
| 518 | IN EFI_EXCEPTION_TYPE ExceptionType,
|
| 519 | IN OUT EFI_SYSTEM_CONTEXT SystemContext
|
| 520 | );
|
| 521 |
|
| 522 |
|
| 523 | /**
|
| 524 | Periodic callback for GDB. This function is used to catch a ctrl-c or other
|
| 525 | break in type command from GDB.
|
| 526 |
|
| 527 | @param SystemContext Register content at time of the call
|
| 528 |
|
| 529 | **/
|
| 530 | VOID
|
| 531 | EFIAPI
|
| 532 | GdbPeriodicCallBack (
|
| 533 | IN OUT EFI_SYSTEM_CONTEXT SystemContext
|
| 534 | );
|
| 535 |
|
| 536 |
|
| 537 | /**
|
| 538 | Make two serail consoles: 1) StdIn and StdOut via GDB. 2) StdErr via GDB.
|
| 539 |
|
| 540 | These console show up on the remote system running GDB
|
| 541 |
|
| 542 | **/
|
| 543 |
|
| 544 | VOID
|
| 545 | GdbInitializeSerialConsole (
|
| 546 | VOID
|
| 547 | );
|
| 548 |
|
| 549 |
|
| 550 | /**
|
| 551 | Send a GDB Remote Serial Protocol Packet
|
| 552 |
|
| 553 | $PacketData#checksum PacketData is passed in and this function adds the packet prefix '$',
|
| 554 | the packet teminating character '#' and the two digit checksum.
|
| 555 |
|
| 556 | If an ack '+' is not sent resend the packet, but timeout eventually so we don't end up
|
| 557 | in an infinit loop. This is so if you unplug the debugger code just keeps running
|
| 558 |
|
| 559 | @param PacketData Payload data for the packet
|
| 560 |
|
| 561 | @retval Number of bytes of packet data sent.
|
| 562 |
|
| 563 | **/
|
| 564 | UINTN
|
| 565 | SendPacket (
|
| 566 | IN CHAR8 *PacketData
|
| 567 | );
|
| 568 |
|
| 569 |
|
| 570 | /**
|
| 571 | Receive a GDB Remote Serial Protocol Packet
|
| 572 |
|
| 573 | $PacketData#checksum PacketData is passed in and this function adds the packet prefix '$',
|
| 574 | the packet teminating character '#' and the two digit checksum.
|
| 575 |
|
| 576 | If host re-starts sending a packet without ending the previous packet, only the last valid packet is proccessed.
|
| 577 | (In other words, if received packet is '$12345$12345$123456#checksum', only '$123456#checksum' will be processed.)
|
| 578 |
|
| 579 | If an ack '+' is not sent resend the packet
|
| 580 |
|
| 581 | @param PacketData Payload data for the packet
|
| 582 |
|
| 583 | @retval Number of bytes of packet data received.
|
| 584 |
|
| 585 | **/
|
| 586 | UINTN
|
| 587 | ReceivePacket (
|
| 588 | OUT CHAR8 *PacketData,
|
| 589 | IN UINTN PacketDataSize
|
| 590 | );
|
| 591 |
|
| 592 |
|
| 593 | /**
|
| 594 | Read data from a FileDescriptor. On success number of bytes read is returned. Zero indicates
|
| 595 | the end of a file. On error -1 is returned. If count is zero, GdbRead returns zero.
|
| 596 |
|
| 597 | @param FileDescriptor Device to talk to.
|
| 598 | @param Buffer Buffer to hold Count bytes that were read
|
| 599 | @param Count Number of bytes to transfer.
|
| 600 |
|
| 601 | @retval -1 Error
|
| 602 | @retval {other} Number of bytes read.
|
| 603 |
|
| 604 | **/
|
| 605 | INTN
|
| 606 | GdbRead (
|
| 607 | IN INTN FileDescriptor,
|
| 608 | OUT VOID *Buffer,
|
| 609 | IN UINTN Count
|
| 610 | );
|
| 611 |
|
| 612 |
|
| 613 | /**
|
| 614 | Write data to a FileDescriptor. On success number of bytes written is returned. Zero indicates
|
| 615 | nothing was written. On error -1 is returned.
|
| 616 |
|
| 617 | @param FileDescriptor Device to talk to.
|
| 618 | @param Buffer Buffer to hold Count bytes that are to be written
|
| 619 | @param Count Number of bytes to transfer.
|
| 620 |
|
| 621 | @retval -1 Error
|
| 622 | @retval {other} Number of bytes written.
|
| 623 |
|
| 624 | **/
|
| 625 | INTN
|
| 626 | GdbWrite (
|
| 627 | IN INTN FileDescriptor,
|
| 628 | OUT CONST VOID *Buffer,
|
| 629 | IN UINTN Count
|
| 630 | );
|
| 631 |
|
| 632 | UINTN *
|
| 633 | FindPointerToRegister (
|
| 634 | IN EFI_SYSTEM_CONTEXT SystemContext,
|
| 635 | IN UINTN RegNumber
|
| 636 | );
|
| 637 |
|
| 638 | CHAR8 *
|
| 639 | BasicReadRegister (
|
| 640 | IN EFI_SYSTEM_CONTEXT SystemContext,
|
| 641 | IN UINTN RegNumber,
|
| 642 | IN CHAR8 *OutBufPtr
|
| 643 | );
|
| 644 |
|
| 645 | VOID
|
| 646 | TransferFromInBufToMem (
|
| 647 | IN UINTN Length,
|
| 648 | IN UINT8 *Address,
|
| 649 | IN CHAR8 *NewData
|
| 650 | );
|
| 651 |
|
| 652 | VOID
|
| 653 | TransferFromMemToOutBufAndSend (
|
| 654 | IN UINTN Length,
|
| 655 | IN UINT8 *Address
|
| 656 | );
|
| 657 |
|
| 658 | CHAR8 *
|
| 659 | BasicWriteRegister (
|
| 660 | IN EFI_SYSTEM_CONTEXT SystemContext,
|
| 661 | IN UINTN RegNumber,
|
| 662 | IN CHAR8 *InBufPtr
|
| 663 | );
|
| 664 |
|
| 665 | VOID
|
| 666 | PrintReg (
|
| 667 | EFI_SYSTEM_CONTEXT SystemContext
|
| 668 | );
|
| 669 |
|
| 670 | UINTN
|
| 671 | ParseBreakpointPacket (
|
| 672 | IN CHAR8 *PacketData,
|
| 673 | OUT UINTN *Type,
|
| 674 | OUT UINTN *Address,
|
| 675 | OUT UINTN *Length
|
| 676 | );
|
| 677 |
|
| 678 | UINTN
|
| 679 | GetBreakpointDataAddress (
|
| 680 | IN EFI_SYSTEM_CONTEXT SystemContext,
|
| 681 | IN UINTN BreakpointNumber
|
| 682 | );
|
| 683 |
|
| 684 | UINTN
|
| 685 | GetBreakpointDetected (
|
| 686 | IN EFI_SYSTEM_CONTEXT SystemContext
|
| 687 | );
|
| 688 |
|
| 689 | BREAK_TYPE
|
| 690 | GetBreakpointType (
|
| 691 | IN EFI_SYSTEM_CONTEXT SystemContext,
|
| 692 | IN UINTN BreakpointNumber
|
| 693 | );
|
| 694 |
|
| 695 | UINTN
|
| 696 | ConvertLengthData (
|
| 697 | IN UINTN Length
|
| 698 | );
|
| 699 |
|
| 700 | EFI_STATUS
|
| 701 | FindNextFreeDebugRegister (
|
| 702 | IN EFI_SYSTEM_CONTEXT SystemContext,
|
| 703 | OUT UINTN *Register
|
| 704 | );
|
| 705 |
|
| 706 | EFI_STATUS
|
| 707 | EnableDebugRegister (
|
| 708 | IN EFI_SYSTEM_CONTEXT SystemContext,
|
| 709 | IN UINTN Register,
|
| 710 | IN UINTN Address,
|
| 711 | IN UINTN Length,
|
| 712 | IN UINTN Type
|
| 713 | );
|
| 714 |
|
| 715 | EFI_STATUS
|
| 716 | FindMatchingDebugRegister (
|
| 717 | IN EFI_SYSTEM_CONTEXT SystemContext,
|
| 718 | IN UINTN Address,
|
| 719 | IN UINTN Length,
|
| 720 | IN UINTN Type,
|
| 721 | OUT UINTN *Register
|
| 722 | );
|
| 723 |
|
| 724 | EFI_STATUS
|
| 725 | DisableDebugRegister (
|
| 726 | IN EFI_SYSTEM_CONTEXT SystemContext,
|
| 727 | IN UINTN Register
|
| 728 | );
|
| 729 |
|
| 730 | VOID
|
| 731 | InitializeProcessor (
|
| 732 | VOID
|
| 733 | );
|
| 734 |
|
| 735 | BOOLEAN
|
| 736 | ValidateAddress (
|
| 737 | IN VOID *Address
|
| 738 | );
|
| 739 |
|
| 740 | BOOLEAN
|
| 741 | ValidateException (
|
| 742 | IN EFI_EXCEPTION_TYPE ExceptionType,
|
| 743 | IN OUT EFI_SYSTEM_CONTEXT SystemContext
|
| 744 | );
|
| 745 |
|
| 746 | #endif
|