1 /** @file 2 DebugSupport protocol and supporting definitions as defined in the UEFI2.4 3 specification. 4 5 The DebugSupport protocol is used by source level debuggers to abstract the 6 processor and handle context save and restore operations. 7 8 Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> 9 Portions copyright (c) 2011 - 2013, ARM Ltd. All rights reserved.<BR> 10 Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights reserved.<BR> 11 12 SPDX-License-Identifier: BSD-2-Clause-Patent 13 14 **/ 15 16 #ifndef __DEBUG_SUPPORT_H__ 17 #define __DEBUG_SUPPORT_H__ 18 19 #include <IndustryStandard/PeImage.h> 20 21 typedef struct _EFI_DEBUG_SUPPORT_PROTOCOL EFI_DEBUG_SUPPORT_PROTOCOL; 22 23 /// 24 /// Debug Support protocol {2755590C-6F3C-42FA-9EA4-A3BA543CDA25}. 25 /// 26 #define EFI_DEBUG_SUPPORT_PROTOCOL_GUID \ 27 { \ 28 0x2755590C, 0x6F3C, 0x42FA, {0x9E, 0xA4, 0xA3, 0xBA, 0x54, 0x3C, 0xDA, 0x25 } \ 29 } 30 31 /// 32 /// Processor exception to be hooked. 33 /// All exception types for IA32, X64, Itanium and EBC processors are defined. 34 /// 35 typedef INTN EFI_EXCEPTION_TYPE; 36 37 /// 38 /// IA-32 processor exception types. 39 /// 40 #define EXCEPT_IA32_DIVIDE_ERROR 0 41 #define EXCEPT_IA32_DEBUG 1 42 #define EXCEPT_IA32_NMI 2 43 #define EXCEPT_IA32_BREAKPOINT 3 44 #define EXCEPT_IA32_OVERFLOW 4 45 #define EXCEPT_IA32_BOUND 5 46 #define EXCEPT_IA32_INVALID_OPCODE 6 47 #define EXCEPT_IA32_DOUBLE_FAULT 8 48 #define EXCEPT_IA32_INVALID_TSS 10 49 #define EXCEPT_IA32_SEG_NOT_PRESENT 11 50 #define EXCEPT_IA32_STACK_FAULT 12 51 #define EXCEPT_IA32_GP_FAULT 13 52 #define EXCEPT_IA32_PAGE_FAULT 14 53 #define EXCEPT_IA32_FP_ERROR 16 54 #define EXCEPT_IA32_ALIGNMENT_CHECK 17 55 #define EXCEPT_IA32_MACHINE_CHECK 18 56 #define EXCEPT_IA32_SIMD 19 57 58 /// 59 /// FXSAVE_STATE. 60 /// FP / MMX / XMM registers (see fxrstor instruction definition). 61 /// 62 typedef struct { 63 UINT16 Fcw; 64 UINT16 Fsw; 65 UINT16 Ftw; 66 UINT16 Opcode; 67 UINT32 Eip; 68 UINT16 Cs; 69 UINT16 Reserved1; 70 UINT32 DataOffset; 71 UINT16 Ds; 72 UINT8 Reserved2[10]; 73 UINT8 St0Mm0[10], Reserved3[6]; 74 UINT8 St1Mm1[10], Reserved4[6]; 75 UINT8 St2Mm2[10], Reserved5[6]; 76 UINT8 St3Mm3[10], Reserved6[6]; 77 UINT8 St4Mm4[10], Reserved7[6]; 78 UINT8 St5Mm5[10], Reserved8[6]; 79 UINT8 St6Mm6[10], Reserved9[6]; 80 UINT8 St7Mm7[10], Reserved10[6]; 81 UINT8 Xmm0[16]; 82 UINT8 Xmm1[16]; 83 UINT8 Xmm2[16]; 84 UINT8 Xmm3[16]; 85 UINT8 Xmm4[16]; 86 UINT8 Xmm5[16]; 87 UINT8 Xmm6[16]; 88 UINT8 Xmm7[16]; 89 UINT8 Reserved11[14 * 16]; 90 } EFI_FX_SAVE_STATE_IA32; 91 92 /// 93 /// IA-32 processor context definition. 94 /// 95 typedef struct { 96 UINT32 ExceptionData; 97 EFI_FX_SAVE_STATE_IA32 FxSaveState; 98 UINT32 Dr0; 99 UINT32 Dr1; 100 UINT32 Dr2; 101 UINT32 Dr3; 102 UINT32 Dr6; 103 UINT32 Dr7; 104 UINT32 Cr0; 105 UINT32 Cr1; /* Reserved */ 106 UINT32 Cr2; 107 UINT32 Cr3; 108 UINT32 Cr4; 109 UINT32 Eflags; 110 UINT32 Ldtr; 111 UINT32 Tr; 112 UINT32 Gdtr[2]; 113 UINT32 Idtr[2]; 114 UINT32 Eip; 115 UINT32 Gs; 116 UINT32 Fs; 117 UINT32 Es; 118 UINT32 Ds; 119 UINT32 Cs; 120 UINT32 Ss; 121 UINT32 Edi; 122 UINT32 Esi; 123 UINT32 Ebp; 124 UINT32 Esp; 125 UINT32 Ebx; 126 UINT32 Edx; 127 UINT32 Ecx; 128 UINT32 Eax; 129 } EFI_SYSTEM_CONTEXT_IA32; 130 131 /// 132 /// x64 processor exception types. 133 /// 134 #define EXCEPT_X64_DIVIDE_ERROR 0 135 #define EXCEPT_X64_DEBUG 1 136 #define EXCEPT_X64_NMI 2 137 #define EXCEPT_X64_BREAKPOINT 3 138 #define EXCEPT_X64_OVERFLOW 4 139 #define EXCEPT_X64_BOUND 5 140 #define EXCEPT_X64_INVALID_OPCODE 6 141 #define EXCEPT_X64_DOUBLE_FAULT 8 142 #define EXCEPT_X64_INVALID_TSS 10 143 #define EXCEPT_X64_SEG_NOT_PRESENT 11 144 #define EXCEPT_X64_STACK_FAULT 12 145 #define EXCEPT_X64_GP_FAULT 13 146 #define EXCEPT_X64_PAGE_FAULT 14 147 #define EXCEPT_X64_FP_ERROR 16 148 #define EXCEPT_X64_ALIGNMENT_CHECK 17 149 #define EXCEPT_X64_MACHINE_CHECK 18 150 #define EXCEPT_X64_SIMD 19 151 152 /// 153 /// FXSAVE_STATE. 154 /// FP / MMX / XMM registers (see fxrstor instruction definition). 155 /// 156 typedef struct { 157 UINT16 Fcw; 158 UINT16 Fsw; 159 UINT16 Ftw; 160 UINT16 Opcode; 161 UINT64 Rip; 162 UINT64 DataOffset; 163 UINT8 Reserved1[8]; 164 UINT8 St0Mm0[10], Reserved2[6]; 165 UINT8 St1Mm1[10], Reserved3[6]; 166 UINT8 St2Mm2[10], Reserved4[6]; 167 UINT8 St3Mm3[10], Reserved5[6]; 168 UINT8 St4Mm4[10], Reserved6[6]; 169 UINT8 St5Mm5[10], Reserved7[6]; 170 UINT8 St6Mm6[10], Reserved8[6]; 171 UINT8 St7Mm7[10], Reserved9[6]; 172 UINT8 Xmm0[16]; 173 UINT8 Xmm1[16]; 174 UINT8 Xmm2[16]; 175 UINT8 Xmm3[16]; 176 UINT8 Xmm4[16]; 177 UINT8 Xmm5[16]; 178 UINT8 Xmm6[16]; 179 UINT8 Xmm7[16]; 180 // 181 // NOTE: UEFI 2.0 spec definition as follows. 182 // 183 UINT8 Reserved11[14 * 16]; 184 } EFI_FX_SAVE_STATE_X64; 185 186 /// 187 /// x64 processor context definition. 188 /// 189 typedef struct { 190 UINT64 ExceptionData; 191 EFI_FX_SAVE_STATE_X64 FxSaveState; 192 UINT64 Dr0; 193 UINT64 Dr1; 194 UINT64 Dr2; 195 UINT64 Dr3; 196 UINT64 Dr6; 197 UINT64 Dr7; 198 UINT64 Cr0; 199 UINT64 Cr1; /* Reserved */ 200 UINT64 Cr2; 201 UINT64 Cr3; 202 UINT64 Cr4; 203 UINT64 Cr8; 204 UINT64 Rflags; 205 UINT64 Ldtr; 206 UINT64 Tr; 207 UINT64 Gdtr[2]; 208 UINT64 Idtr[2]; 209 UINT64 Rip; 210 UINT64 Gs; 211 UINT64 Fs; 212 UINT64 Es; 213 UINT64 Ds; 214 UINT64 Cs; 215 UINT64 Ss; 216 UINT64 Rdi; 217 UINT64 Rsi; 218 UINT64 Rbp; 219 UINT64 Rsp; 220 UINT64 Rbx; 221 UINT64 Rdx; 222 UINT64 Rcx; 223 UINT64 Rax; 224 UINT64 R8; 225 UINT64 R9; 226 UINT64 R10; 227 UINT64 R11; 228 UINT64 R12; 229 UINT64 R13; 230 UINT64 R14; 231 UINT64 R15; 232 } EFI_SYSTEM_CONTEXT_X64; 233 234 /// 235 /// Itanium Processor Family Exception types. 236 /// 237 #define EXCEPT_IPF_VHTP_TRANSLATION 0 238 #define EXCEPT_IPF_INSTRUCTION_TLB 1 239 #define EXCEPT_IPF_DATA_TLB 2 240 #define EXCEPT_IPF_ALT_INSTRUCTION_TLB 3 241 #define EXCEPT_IPF_ALT_DATA_TLB 4 242 #define EXCEPT_IPF_DATA_NESTED_TLB 5 243 #define EXCEPT_IPF_INSTRUCTION_KEY_MISSED 6 244 #define EXCEPT_IPF_DATA_KEY_MISSED 7 245 #define EXCEPT_IPF_DIRTY_BIT 8 246 #define EXCEPT_IPF_INSTRUCTION_ACCESS_BIT 9 247 #define EXCEPT_IPF_DATA_ACCESS_BIT 10 248 #define EXCEPT_IPF_BREAKPOINT 11 249 #define EXCEPT_IPF_EXTERNAL_INTERRUPT 12 250 // 251 // 13 - 19 reserved 252 // 253 #define EXCEPT_IPF_PAGE_NOT_PRESENT 20 254 #define EXCEPT_IPF_KEY_PERMISSION 21 255 #define EXCEPT_IPF_INSTRUCTION_ACCESS_RIGHTS 22 256 #define EXCEPT_IPF_DATA_ACCESS_RIGHTS 23 257 #define EXCEPT_IPF_GENERAL_EXCEPTION 24 258 #define EXCEPT_IPF_DISABLED_FP_REGISTER 25 259 #define EXCEPT_IPF_NAT_CONSUMPTION 26 260 #define EXCEPT_IPF_SPECULATION 27 261 // 262 // 28 reserved 263 // 264 #define EXCEPT_IPF_DEBUG 29 265 #define EXCEPT_IPF_UNALIGNED_REFERENCE 30 266 #define EXCEPT_IPF_UNSUPPORTED_DATA_REFERENCE 31 267 #define EXCEPT_IPF_FP_FAULT 32 268 #define EXCEPT_IPF_FP_TRAP 33 269 #define EXCEPT_IPF_LOWER_PRIVILEGE_TRANSFER_TRAP 34 270 #define EXCEPT_IPF_TAKEN_BRANCH 35 271 #define EXCEPT_IPF_SINGLE_STEP 36 272 // 273 // 37 - 44 reserved 274 // 275 #define EXCEPT_IPF_IA32_EXCEPTION 45 276 #define EXCEPT_IPF_IA32_INTERCEPT 46 277 #define EXCEPT_IPF_IA32_INTERRUPT 47 278 279 /// 280 /// IPF processor context definition. 281 /// 282 typedef struct { 283 // 284 // The first reserved field is necessary to preserve alignment for the correct 285 // bits in UNAT and to insure F2 is 16 byte aligned. 286 // 287 UINT64 Reserved; 288 UINT64 R1; 289 UINT64 R2; 290 UINT64 R3; 291 UINT64 R4; 292 UINT64 R5; 293 UINT64 R6; 294 UINT64 R7; 295 UINT64 R8; 296 UINT64 R9; 297 UINT64 R10; 298 UINT64 R11; 299 UINT64 R12; 300 UINT64 R13; 301 UINT64 R14; 302 UINT64 R15; 303 UINT64 R16; 304 UINT64 R17; 305 UINT64 R18; 306 UINT64 R19; 307 UINT64 R20; 308 UINT64 R21; 309 UINT64 R22; 310 UINT64 R23; 311 UINT64 R24; 312 UINT64 R25; 313 UINT64 R26; 314 UINT64 R27; 315 UINT64 R28; 316 UINT64 R29; 317 UINT64 R30; 318 UINT64 R31; 319 320 UINT64 F2[2]; 321 UINT64 F3[2]; 322 UINT64 F4[2]; 323 UINT64 F5[2]; 324 UINT64 F6[2]; 325 UINT64 F7[2]; 326 UINT64 F8[2]; 327 UINT64 F9[2]; 328 UINT64 F10[2]; 329 UINT64 F11[2]; 330 UINT64 F12[2]; 331 UINT64 F13[2]; 332 UINT64 F14[2]; 333 UINT64 F15[2]; 334 UINT64 F16[2]; 335 UINT64 F17[2]; 336 UINT64 F18[2]; 337 UINT64 F19[2]; 338 UINT64 F20[2]; 339 UINT64 F21[2]; 340 UINT64 F22[2]; 341 UINT64 F23[2]; 342 UINT64 F24[2]; 343 UINT64 F25[2]; 344 UINT64 F26[2]; 345 UINT64 F27[2]; 346 UINT64 F28[2]; 347 UINT64 F29[2]; 348 UINT64 F30[2]; 349 UINT64 F31[2]; 350 351 UINT64 Pr; 352 353 UINT64 B0; 354 UINT64 B1; 355 UINT64 B2; 356 UINT64 B3; 357 UINT64 B4; 358 UINT64 B5; 359 UINT64 B6; 360 UINT64 B7; 361 362 // 363 // application registers 364 // 365 UINT64 ArRsc; 366 UINT64 ArBsp; 367 UINT64 ArBspstore; 368 UINT64 ArRnat; 369 370 UINT64 ArFcr; 371 372 UINT64 ArEflag; 373 UINT64 ArCsd; 374 UINT64 ArSsd; 375 UINT64 ArCflg; 376 UINT64 ArFsr; 377 UINT64 ArFir; 378 UINT64 ArFdr; 379 380 UINT64 ArCcv; 381 382 UINT64 ArUnat; 383 384 UINT64 ArFpsr; 385 386 UINT64 ArPfs; 387 UINT64 ArLc; 388 UINT64 ArEc; 389 390 // 391 // control registers 392 // 393 UINT64 CrDcr; 394 UINT64 CrItm; 395 UINT64 CrIva; 396 UINT64 CrPta; 397 UINT64 CrIpsr; 398 UINT64 CrIsr; 399 UINT64 CrIip; 400 UINT64 CrIfa; 401 UINT64 CrItir; 402 UINT64 CrIipa; 403 UINT64 CrIfs; 404 UINT64 CrIim; 405 UINT64 CrIha; 406 407 // 408 // debug registers 409 // 410 UINT64 Dbr0; 411 UINT64 Dbr1; 412 UINT64 Dbr2; 413 UINT64 Dbr3; 414 UINT64 Dbr4; 415 UINT64 Dbr5; 416 UINT64 Dbr6; 417 UINT64 Dbr7; 418 419 UINT64 Ibr0; 420 UINT64 Ibr1; 421 UINT64 Ibr2; 422 UINT64 Ibr3; 423 UINT64 Ibr4; 424 UINT64 Ibr5; 425 UINT64 Ibr6; 426 UINT64 Ibr7; 427 428 // 429 // virtual registers - nat bits for R1-R31 430 // 431 UINT64 IntNat; 432 } EFI_SYSTEM_CONTEXT_IPF; 433 434 /// 435 /// EBC processor exception types. 436 /// 437 #define EXCEPT_EBC_UNDEFINED 0 438 #define EXCEPT_EBC_DIVIDE_ERROR 1 439 #define EXCEPT_EBC_DEBUG 2 440 #define EXCEPT_EBC_BREAKPOINT 3 441 #define EXCEPT_EBC_OVERFLOW 4 442 #define EXCEPT_EBC_INVALID_OPCODE 5 ///< Opcode out of range. 443 #define EXCEPT_EBC_STACK_FAULT 6 444 #define EXCEPT_EBC_ALIGNMENT_CHECK 7 445 #define EXCEPT_EBC_INSTRUCTION_ENCODING 8 ///< Malformed instruction. 446 #define EXCEPT_EBC_BAD_BREAK 9 ///< BREAK 0 or undefined BREAK. 447 #define EXCEPT_EBC_STEP 10 ///< To support debug stepping. 448 /// 449 /// For coding convenience, define the maximum valid EBC exception. 450 /// 451 #define MAX_EBC_EXCEPTION EXCEPT_EBC_STEP 452 453 /// 454 /// EBC processor context definition. 455 /// 456 typedef struct { 457 UINT64 R0; 458 UINT64 R1; 459 UINT64 R2; 460 UINT64 R3; 461 UINT64 R4; 462 UINT64 R5; 463 UINT64 R6; 464 UINT64 R7; 465 UINT64 Flags; 466 UINT64 ControlFlags; 467 UINT64 Ip; 468 } EFI_SYSTEM_CONTEXT_EBC; 469 470 /// 471 /// ARM processor exception types. 472 /// 473 #define EXCEPT_ARM_RESET 0 474 #define EXCEPT_ARM_UNDEFINED_INSTRUCTION 1 475 #define EXCEPT_ARM_SOFTWARE_INTERRUPT 2 476 #define EXCEPT_ARM_PREFETCH_ABORT 3 477 #define EXCEPT_ARM_DATA_ABORT 4 478 #define EXCEPT_ARM_RESERVED 5 479 #define EXCEPT_ARM_IRQ 6 480 #define EXCEPT_ARM_FIQ 7 481 482 /// 483 /// For coding convenience, define the maximum valid ARM exception. 484 /// 485 #define MAX_ARM_EXCEPTION EXCEPT_ARM_FIQ 486 487 /// 488 /// ARM processor context definition. 489 /// 490 typedef struct { 491 UINT32 R0; 492 UINT32 R1; 493 UINT32 R2; 494 UINT32 R3; 495 UINT32 R4; 496 UINT32 R5; 497 UINT32 R6; 498 UINT32 R7; 499 UINT32 R8; 500 UINT32 R9; 501 UINT32 R10; 502 UINT32 R11; 503 UINT32 R12; 504 UINT32 SP; 505 UINT32 LR; 506 UINT32 PC; 507 UINT32 CPSR; 508 UINT32 DFSR; 509 UINT32 DFAR; 510 UINT32 IFSR; 511 UINT32 IFAR; 512 } EFI_SYSTEM_CONTEXT_ARM; 513 514 /// 515 /// AARCH64 processor exception types. 516 /// 517 #define EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS 0 518 #define EXCEPT_AARCH64_IRQ 1 519 #define EXCEPT_AARCH64_FIQ 2 520 #define EXCEPT_AARCH64_SERROR 3 521 522 /// 523 /// For coding convenience, define the maximum valid ARM exception. 524 /// 525 #define MAX_AARCH64_EXCEPTION EXCEPT_AARCH64_SERROR 526 527 typedef struct { 528 // General Purpose Registers 529 UINT64 X0; 530 UINT64 X1; 531 UINT64 X2; 532 UINT64 X3; 533 UINT64 X4; 534 UINT64 X5; 535 UINT64 X6; 536 UINT64 X7; 537 UINT64 X8; 538 UINT64 X9; 539 UINT64 X10; 540 UINT64 X11; 541 UINT64 X12; 542 UINT64 X13; 543 UINT64 X14; 544 UINT64 X15; 545 UINT64 X16; 546 UINT64 X17; 547 UINT64 X18; 548 UINT64 X19; 549 UINT64 X20; 550 UINT64 X21; 551 UINT64 X22; 552 UINT64 X23; 553 UINT64 X24; 554 UINT64 X25; 555 UINT64 X26; 556 UINT64 X27; 557 UINT64 X28; 558 UINT64 FP; // x29 - Frame pointer 559 UINT64 LR; // x30 - Link Register 560 UINT64 SP; // x31 - Stack pointer 561 562 // FP/SIMD Registers 563 UINT64 V0[2]; 564 UINT64 V1[2]; 565 UINT64 V2[2]; 566 UINT64 V3[2]; 567 UINT64 V4[2]; 568 UINT64 V5[2]; 569 UINT64 V6[2]; 570 UINT64 V7[2]; 571 UINT64 V8[2]; 572 UINT64 V9[2]; 573 UINT64 V10[2]; 574 UINT64 V11[2]; 575 UINT64 V12[2]; 576 UINT64 V13[2]; 577 UINT64 V14[2]; 578 UINT64 V15[2]; 579 UINT64 V16[2]; 580 UINT64 V17[2]; 581 UINT64 V18[2]; 582 UINT64 V19[2]; 583 UINT64 V20[2]; 584 UINT64 V21[2]; 585 UINT64 V22[2]; 586 UINT64 V23[2]; 587 UINT64 V24[2]; 588 UINT64 V25[2]; 589 UINT64 V26[2]; 590 UINT64 V27[2]; 591 UINT64 V28[2]; 592 UINT64 V29[2]; 593 UINT64 V30[2]; 594 UINT64 V31[2]; 595 596 UINT64 ELR; // Exception Link Register 597 UINT64 SPSR; // Saved Processor Status Register 598 UINT64 FPSR; // Floating Point Status Register 599 UINT64 ESR; // Exception syndrome register 600 UINT64 FAR; // Fault Address Register 601 } EFI_SYSTEM_CONTEXT_AARCH64; 602 603 /// 604 /// RISC-V processor exception types. 605 /// 606 #define EXCEPT_RISCV_INST_MISALIGNED 0 607 #define EXCEPT_RISCV_INST_ACCESS_FAULT 1 608 #define EXCEPT_RISCV_ILLEGAL_INST 2 609 #define EXCEPT_RISCV_BREAKPOINT 3 610 #define EXCEPT_RISCV_LOAD_ADDRESS_MISALIGNED 4 611 #define EXCEPT_RISCV_LOAD_ACCESS_FAULT 5 612 #define EXCEPT_RISCV_STORE_AMO_ADDRESS_MISALIGNED 6 613 #define EXCEPT_RISCV_STORE_AMO_ACCESS_FAULT 7 614 #define EXCEPT_RISCV_ENV_CALL_FROM_UMODE 8 615 #define EXCEPT_RISCV_ENV_CALL_FROM_SMODE 9 616 #define EXCEPT_RISCV_ENV_CALL_FROM_HMODE 10 617 #define EXCEPT_RISCV_ENV_CALL_FROM_MMODE 11 618 619 #define EXCEPT_RISCV_SOFTWARE_INT 0x0 620 #define EXCEPT_RISCV_TIMER_INT 0x1 621 622 typedef struct { 623 UINT64 X0; 624 UINT64 X1; 625 UINT64 X2; 626 UINT64 X3; 627 UINT64 X4; 628 UINT64 X5; 629 UINT64 X6; 630 UINT64 X7; 631 UINT64 X8; 632 UINT64 X9; 633 UINT64 X10; 634 UINT64 X11; 635 UINT64 X12; 636 UINT64 X13; 637 UINT64 X14; 638 UINT64 X15; 639 UINT64 X16; 640 UINT64 X17; 641 UINT64 X18; 642 UINT64 X19; 643 UINT64 X20; 644 UINT64 X21; 645 UINT64 X22; 646 UINT64 X23; 647 UINT64 X24; 648 UINT64 X25; 649 UINT64 X26; 650 UINT64 X27; 651 UINT64 X28; 652 UINT64 X29; 653 UINT64 X30; 654 UINT64 X31; 655 } EFI_SYSTEM_CONTEXT_RISCV64; 656 657 /// 658 /// Universal EFI_SYSTEM_CONTEXT definition. 659 /// 660 typedef union { 661 EFI_SYSTEM_CONTEXT_EBC *SystemContextEbc; 662 EFI_SYSTEM_CONTEXT_IA32 *SystemContextIa32; 663 EFI_SYSTEM_CONTEXT_X64 *SystemContextX64; 664 EFI_SYSTEM_CONTEXT_IPF *SystemContextIpf; 665 EFI_SYSTEM_CONTEXT_ARM *SystemContextArm; 666 EFI_SYSTEM_CONTEXT_AARCH64 *SystemContextAArch64; 667 EFI_SYSTEM_CONTEXT_RISCV64 *SystemContextRiscV64; 668 } EFI_SYSTEM_CONTEXT; 669 670 // 671 // DebugSupport callback function prototypes 672 // 673 674 /** 675 Registers and enables an exception callback function for the specified exception. 676 677 @param ExceptionType Exception types in EBC, IA-32, x64, or IPF. 678 @param SystemContext Exception content. 679 680 **/ 681 typedef 682 VOID 683 (EFIAPI *EFI_EXCEPTION_CALLBACK)( 684 IN EFI_EXCEPTION_TYPE ExceptionType, 685 IN OUT EFI_SYSTEM_CONTEXT SystemContext 686 ); 687 688 /** 689 Registers and enables the on-target debug agent's periodic entry point. 690 691 @param SystemContext Exception content. 692 693 **/ 694 typedef 695 VOID 696 (EFIAPI *EFI_PERIODIC_CALLBACK)( 697 IN OUT EFI_SYSTEM_CONTEXT SystemContext 698 ); 699 700 /// 701 /// Machine type definition 702 /// 703 typedef enum { 704 IsaIa32 = IMAGE_FILE_MACHINE_I386, ///< 0x014C 705 IsaX64 = IMAGE_FILE_MACHINE_X64, ///< 0x8664 706 IsaIpf = IMAGE_FILE_MACHINE_IA64, ///< 0x0200 707 IsaEbc = IMAGE_FILE_MACHINE_EBC, ///< 0x0EBC 708 IsaArm = IMAGE_FILE_MACHINE_ARMTHUMB_MIXED, ///< 0x01c2 709 IsaAArch64 = IMAGE_FILE_MACHINE_ARM64 ///< 0xAA64 710 } EFI_INSTRUCTION_SET_ARCHITECTURE; 711 712 // 713 // DebugSupport member function definitions 714 // 715 716 /** 717 Returns the maximum value that may be used for the ProcessorIndex parameter in 718 RegisterPeriodicCallback() and RegisterExceptionCallback(). 719 720 @param This A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance. 721 @param MaxProcessorIndex Pointer to a caller-allocated UINTN in which the maximum supported 722 processor index is returned. 723 724 @retval EFI_SUCCESS The function completed successfully. 725 726 **/ 727 typedef 728 EFI_STATUS 729 (EFIAPI *EFI_GET_MAXIMUM_PROCESSOR_INDEX)( 730 IN EFI_DEBUG_SUPPORT_PROTOCOL *This, 731 OUT UINTN *MaxProcessorIndex 732 ); 733 734 /** 735 Registers a function to be called back periodically in interrupt context. 736 737 @param This A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance. 738 @param ProcessorIndex Specifies which processor the callback function applies to. 739 @param PeriodicCallback A pointer to a function of type PERIODIC_CALLBACK that is the main 740 periodic entry point of the debug agent. 741 742 @retval EFI_SUCCESS The function completed successfully. 743 @retval EFI_ALREADY_STARTED Non-NULL PeriodicCallback parameter when a callback 744 function was previously registered. 745 @retval EFI_OUT_OF_RESOURCES System has insufficient memory resources to register new callback 746 function. 747 748 **/ 749 typedef 750 EFI_STATUS 751 (EFIAPI *EFI_REGISTER_PERIODIC_CALLBACK)( 752 IN EFI_DEBUG_SUPPORT_PROTOCOL *This, 753 IN UINTN ProcessorIndex, 754 IN EFI_PERIODIC_CALLBACK PeriodicCallback 755 ); 756 757 /** 758 Registers a function to be called when a given processor exception occurs. 759 760 @param This A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance. 761 @param ProcessorIndex Specifies which processor the callback function applies to. 762 @param ExceptionCallback A pointer to a function of type EXCEPTION_CALLBACK that is called 763 when the processor exception specified by ExceptionType occurs. 764 @param ExceptionType Specifies which processor exception to hook. 765 766 @retval EFI_SUCCESS The function completed successfully. 767 @retval EFI_ALREADY_STARTED Non-NULL PeriodicCallback parameter when a callback 768 function was previously registered. 769 @retval EFI_OUT_OF_RESOURCES System has insufficient memory resources to register new callback 770 function. 771 772 **/ 773 typedef 774 EFI_STATUS 775 (EFIAPI *EFI_REGISTER_EXCEPTION_CALLBACK)( 776 IN EFI_DEBUG_SUPPORT_PROTOCOL *This, 777 IN UINTN ProcessorIndex, 778 IN EFI_EXCEPTION_CALLBACK ExceptionCallback, 779 IN EFI_EXCEPTION_TYPE ExceptionType 780 ); 781 782 /** 783 Invalidates processor instruction cache for a memory range. Subsequent execution in this range 784 causes a fresh memory fetch to retrieve code to be executed. 785 786 @param This A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance. 787 @param ProcessorIndex Specifies which processor's instruction cache is to be invalidated. 788 @param Start Specifies the physical base of the memory range to be invalidated. 789 @param Length Specifies the minimum number of bytes in the processor's instruction 790 cache to invalidate. 791 792 @retval EFI_SUCCESS The function completed successfully. 793 794 **/ 795 typedef 796 EFI_STATUS 797 (EFIAPI *EFI_INVALIDATE_INSTRUCTION_CACHE)( 798 IN EFI_DEBUG_SUPPORT_PROTOCOL *This, 799 IN UINTN ProcessorIndex, 800 IN VOID *Start, 801 IN UINT64 Length 802 ); 803 804 /// 805 /// This protocol provides the services to allow the debug agent to register 806 /// callback functions that are called either periodically or when specific 807 /// processor exceptions occur. 808 /// 809 struct _EFI_DEBUG_SUPPORT_PROTOCOL { 810 /// 811 /// Declares the processor architecture for this instance of the EFI Debug Support protocol. 812 /// 813 EFI_INSTRUCTION_SET_ARCHITECTURE Isa; 814 EFI_GET_MAXIMUM_PROCESSOR_INDEX GetMaximumProcessorIndex; 815 EFI_REGISTER_PERIODIC_CALLBACK RegisterPeriodicCallback; 816 EFI_REGISTER_EXCEPTION_CALLBACK RegisterExceptionCallback; 817 EFI_INVALIDATE_INSTRUCTION_CACHE InvalidateInstructionCache; 818 }; 819 820 extern EFI_GUID gEfiDebugSupportProtocolGuid; 821 822 #endif 823