Home | History | Annotate | Line # | Download | only in inc
      1 /*	$NetBSD: efidebug.h,v 1.1.1.2 2018/08/16 18:17:47 jmcneill Exp $	*/
      2 
      3 #ifndef _EFI_DEBUG_H
      4 #define _EFI_DEBUG_H
      5 
      6 /*++
      7 
      8 Copyright (c) 1998  Intel Corporation
      9 
     10 Module Name:
     11 
     12     efidebug.h
     13 
     14 Abstract:
     15 
     16     EFI library debug functions
     17 
     18 
     19 
     20 Revision History
     21 
     22 --*/
     23 
     24 extern UINTN     EFIDebug;
     25 
     26 #if EFI_DEBUG
     27 
     28     #define DBGASSERT(a)        DbgAssert(__FILE__, __LINE__, #a)
     29     #define DEBUG(a)            DbgPrint a
     30 
     31 #else
     32 
     33     #define DBGASSERT(a)
     34     #define DEBUG(a)
     35 
     36 #endif
     37 
     38 #if EFI_DEBUG_CLEAR_MEMORY
     39 
     40     #define DBGSETMEM(a,l)      SetMem(a,l,(CHAR8)BAD_POINTER)
     41 
     42 #else
     43 
     44     #define DBGSETMEM(a,l)
     45 
     46 #endif
     47 
     48 #define D_INIT        0x00000001          // Initialization style messages
     49 #define D_WARN        0x00000002          // Warnings
     50 #define D_LOAD        0x00000004          // Load events
     51 #define D_FS          0x00000008          // EFI File system
     52 #define D_POOL        0x00000010          // Alloc & Free's
     53 #define D_PAGE        0x00000020          // Alloc & Free's
     54 #define D_INFO        0x00000040          // Verbose
     55 #define D_VAR         0x00000100          // Variable
     56 #define D_PARSE       0x00000200          // Command parsing
     57 #define D_BM          0x00000400          // Boot manager
     58 #define D_BLKIO       0x00001000          // BlkIo Driver
     59 #define D_BLKIO_ULTRA 0x00002000          // BlkIo Driver
     60 #define D_NET         0x00004000          // SNI Driver
     61 #define D_NET_ULTRA   0x00008000          // SNI Driver
     62 #define D_TXTIN       0x00010000          // Simple Input Driver
     63 #define D_TXTOUT      0x00020000          // Simple Text Output Driver
     64 #define D_ERROR_ATA	  0x00040000		  		// ATA error messages
     65 #define D_ERROR       0x80000000          // Error
     66 
     67 #define D_RESERVED    0x7fffC880          // Bits not reserved above
     68 
     69 //
     70 // Current Debug level of the system, value of EFIDebug
     71 //
     72 //#define EFI_DBUG_MASK   (D_ERROR | D_WARN | D_LOAD | D_BLKIO | D_INIT)
     73 #define EFI_DBUG_MASK   (D_ERROR)
     74 
     75 //
     76 //
     77 //
     78 
     79 #if EFI_DEBUG
     80 
     81     #define ASSERT(a)               if(!(a))       DBGASSERT(a)
     82     #define ASSERT_LOCKED(l)        if(!(l)->Lock) DBGASSERT(l not locked)
     83     #define ASSERT_STRUCT(p,t)      DBGASSERT(t not structure), p
     84 
     85 #else
     86 
     87     #define ASSERT(a)
     88     #define ASSERT_LOCKED(l)
     89     #define ASSERT_STRUCT(p,t)
     90 
     91 #endif
     92 
     93 //
     94 // Prototypes
     95 //
     96 
     97 INTN
     98 DbgAssert (
     99     CONST CHAR8   *file,
    100     INTN          lineno,
    101     CONST CHAR8   *string
    102     );
    103 
    104 INTN
    105 DbgPrint (
    106     INTN          mask,
    107     CONST CHAR8   *format,
    108     ...
    109     );
    110 
    111 //
    112 // Instruction Set Architectures definitions for debuggers
    113 //
    114 
    115 typedef INTN EFI_EXCEPTION_TYPE;
    116 
    117 // IA32
    118 #define EXCEPT_IA32_DIVIDE_ERROR    0
    119 #define EXCEPT_IA32_DEBUG           1
    120 #define EXCEPT_IA32_NMI             2
    121 #define EXCEPT_IA32_BREAKPOINT      3
    122 #define EXCEPT_IA32_OVERFLOW        4
    123 #define EXCEPT_IA32_BOUND           5
    124 #define EXCEPT_IA32_INVALID_OPCODE  6
    125 #define EXCEPT_IA32_DOUBLE_FAULT    8
    126 #define EXCEPT_IA32_INVALID_TSS     10
    127 #define EXCEPT_IA32_SEG_NOT_PRESENT 11
    128 #define EXCEPT_IA32_STACK_FAULT     12
    129 #define EXCEPT_IA32_GP_FAULT        13
    130 #define EXCEPT_IA32_PAGE_FAULT      14
    131 #define EXCEPT_IA32_FP_ERROR        16
    132 #define EXCEPT_IA32_ALIGNMENT_CHECK 17
    133 #define EXCEPT_IA32_MACHINE_CHECK   18
    134 #define EXCEPT_IA32_SIMD            19
    135 
    136 typedef struct {
    137     UINT16  Fcw;
    138     UINT16  Fsw;
    139     UINT16  Ftw;
    140     UINT16  Opcode;
    141     UINT32  Eip;
    142     UINT16  Cs;
    143     UINT16  Reserved1;
    144     UINT32  DataOffset;
    145     UINT16  Ds;
    146     UINT8   Reserved2[10];
    147     UINT8   St0Mm0[10], Reserved3[6];
    148     UINT8   St1Mm1[10], Reserved4[6];
    149     UINT8   St2Mm2[10], Reserved5[6];
    150     UINT8   St3Mm3[10], Reserved6[6];
    151     UINT8   St4Mm4[10], Reserved7[6];
    152     UINT8   St5Mm5[10], Reserved8[6];
    153     UINT8   St6Mm6[10], Reserved9[6];
    154     UINT8   St7Mm7[10], Reserved10[6];
    155     UINT8   Xmm0[16];
    156     UINT8   Xmm1[16];
    157     UINT8   Xmm2[16];
    158     UINT8   Xmm3[16];
    159     UINT8   Xmm4[16];
    160     UINT8   Xmm5[16];
    161     UINT8   Xmm6[16];
    162     UINT8   Xmm7[16];
    163     UINT8   Reserved11[14 * 16];
    164 } EFI_FX_SAVE_STATE_IA32;
    165 
    166 typedef struct {
    167     UINT32                 ExceptionData;
    168     EFI_FX_SAVE_STATE_IA32 FxSaveState;
    169     UINT32                 Dr0;
    170     UINT32                 Dr1;
    171     UINT32                 Dr2;
    172     UINT32                 Dr3;
    173     UINT32                 Dr6;
    174     UINT32                 Dr7;
    175     UINT32                 Cr0;
    176     UINT32                 Cr1;
    177     UINT32                 Cr2;
    178     UINT32                 Cr3;
    179     UINT32                 Cr4;
    180     UINT32                 Eflags;
    181     UINT32                 Ldtr;
    182     UINT32                 Tr;
    183     UINT32                 Gdtr[2];
    184     UINT32                 Idtr[2];
    185     UINT32                 Eip;
    186     UINT32                 Gs;
    187     UINT32                 Fs;
    188     UINT32                 Es;
    189     UINT32                 Ds;
    190     UINT32                 Cs;
    191     UINT32                 Ss;
    192     UINT32                 Edi;
    193     UINT32                 Esi;
    194     UINT32                 Ebp;
    195     UINT32                 Esp;
    196     UINT32                 Ebx;
    197     UINT32                 Edx;
    198     UINT32                 Ecx;
    199     UINT32                 Eax;
    200 } EFI_SYSTEM_CONTEXT_IA32;
    201 
    202 // X64
    203 #define EXCEPT_X64_DIVIDE_ERROR    0
    204 #define EXCEPT_X64_DEBUG           1
    205 #define EXCEPT_X64_NMI             2
    206 #define EXCEPT_X64_BREAKPOINT      3
    207 #define EXCEPT_X64_OVERFLOW        4
    208 #define EXCEPT_X64_BOUND           5
    209 #define EXCEPT_X64_INVALID_OPCODE  6
    210 #define EXCEPT_X64_DOUBLE_FAULT    8
    211 #define EXCEPT_X64_INVALID_TSS     10
    212 #define EXCEPT_X64_SEG_NOT_PRESENT 11
    213 #define EXCEPT_X64_STACK_FAULT     12
    214 #define EXCEPT_X64_GP_FAULT        13
    215 #define EXCEPT_X64_PAGE_FAULT      14
    216 #define EXCEPT_X64_FP_ERROR        16
    217 #define EXCEPT_X64_ALIGNMENT_CHECK 17
    218 #define EXCEPT_X64_MACHINE_CHECK   18
    219 #define EXCEPT_X64_SIMD            19
    220 
    221 typedef struct {
    222     UINT16  Fcw;
    223     UINT16  Fsw;
    224     UINT16  Ftw;
    225     UINT16  Opcode;
    226     UINT64  Rip;
    227     UINT64  DataOffset;
    228     UINT8   Reserved1[8];
    229     UINT8   St0Mm0[10], Reserved2[6];
    230     UINT8   St1Mm1[10], Reserved3[6];
    231     UINT8   St2Mm2[10], Reserved4[6];
    232     UINT8   St3Mm3[10], Reserved5[6];
    233     UINT8   St4Mm4[10], Reserved6[6];
    234     UINT8   St5Mm5[10], Reserved7[6];
    235     UINT8   St6Mm6[10], Reserved8[6];
    236     UINT8   St7Mm7[10], Reserved9[6];
    237     UINT8   Xmm0[16];
    238     UINT8   Xmm1[16];
    239     UINT8   Xmm2[16];
    240     UINT8   Xmm3[16];
    241     UINT8   Xmm4[16];
    242     UINT8   Xmm5[16];
    243     UINT8   Xmm6[16];
    244     UINT8   Xmm7[16];
    245     UINT8   Reserved11[14 * 16];
    246 } EFI_FX_SAVE_STATE_X64;
    247 
    248 typedef struct {
    249     UINT64                ExceptionData;
    250     EFI_FX_SAVE_STATE_X64 FxSaveState;
    251     UINT64                Dr0;
    252     UINT64                Dr1;
    253     UINT64                Dr2;
    254     UINT64                Dr3;
    255     UINT64                Dr6;
    256     UINT64                Dr7;
    257     UINT64                Cr0;
    258     UINT64                Cr1;
    259     UINT64                Cr2;
    260     UINT64                Cr3;
    261     UINT64                Cr4;
    262     UINT64                Cr8;
    263     UINT64                Rflags;
    264     UINT64                Ldtr;
    265     UINT64                Tr;
    266     UINT64                Gdtr[2];
    267     UINT64                Idtr[2];
    268     UINT64                Rip;
    269     UINT64                Gs;
    270     UINT64                Fs;
    271     UINT64                Es;
    272     UINT64                Ds;
    273     UINT64                Cs;
    274     UINT64                Ss;
    275     UINT64                Rdi;
    276     UINT64                Rsi;
    277     UINT64                Rbp;
    278     UINT64                Rsp;
    279     UINT64                Rbx;
    280     UINT64                Rdx;
    281     UINT64                Rcx;
    282     UINT64                Rax;
    283     UINT64                R8;
    284     UINT64                R9;
    285     UINT64                R10;
    286     UINT64                R11;
    287     UINT64                R12;
    288     UINT64                R13;
    289     UINT64                R14;
    290     UINT64                R15;
    291 } EFI_SYSTEM_CONTEXT_X64;
    292 
    293 /// IA64
    294 #define EXCEPT_IPF_VHTP_TRANSLATION               0
    295 #define EXCEPT_IPF_INSTRUCTION_TLB                1
    296 #define EXCEPT_IPF_DATA_TLB                       2
    297 #define EXCEPT_IPF_ALT_INSTRUCTION_TLB            3
    298 #define EXCEPT_IPF_ALT_DATA_TLB                   4
    299 #define EXCEPT_IPF_DATA_NESTED_TLB                5
    300 #define EXCEPT_IPF_INSTRUCTION_KEY_MISSED         6
    301 #define EXCEPT_IPF_DATA_KEY_MISSED                7
    302 #define EXCEPT_IPF_DIRTY_BIT                      8
    303 #define EXCEPT_IPF_INSTRUCTION_ACCESS_BIT         9
    304 #define EXCEPT_IPF_DATA_ACCESS_BIT                10
    305 #define EXCEPT_IPF_BREAKPOINT                     11
    306 #define EXCEPT_IPF_EXTERNAL_INTERRUPT             12
    307 #define EXCEPT_IPF_PAGE_NOT_PRESENT               20
    308 #define EXCEPT_IPF_KEY_PERMISSION                 21
    309 #define EXCEPT_IPF_INSTRUCTION_ACCESS_RIGHTS      22
    310 #define EXCEPT_IPF_DATA_ACCESS_RIGHTS             23
    311 #define EXCEPT_IPF_GENERAL_EXCEPTION              24
    312 #define EXCEPT_IPF_DISABLED_FP_REGISTER           25
    313 #define EXCEPT_IPF_NAT_CONSUMPTION                26
    314 #define EXCEPT_IPF_SPECULATION                    27
    315 #define EXCEPT_IPF_DEBUG                          29
    316 #define EXCEPT_IPF_UNALIGNED_REFERENCE            30
    317 #define EXCEPT_IPF_UNSUPPORTED_DATA_REFERENCE     31
    318 #define EXCEPT_IPF_FP_FAULT                       32
    319 #define EXCEPT_IPF_FP_TRAP                        33
    320 #define EXCEPT_IPF_LOWER_PRIVILEGE_TRANSFER_TRAP  34
    321 #define EXCEPT_IPF_TAKEN_BRANCH                   35
    322 #define EXCEPT_IPF_SINGLE_STEP                    36
    323 #define EXCEPT_IPF_IA32_EXCEPTION                 45
    324 #define EXCEPT_IPF_IA32_INTERCEPT                 46
    325 #define EXCEPT_IPF_IA32_INTERRUPT                 47
    326 
    327 typedef struct {
    328     UINT64  Reserved;
    329     UINT64  R1;
    330     UINT64  R2;
    331     UINT64  R3;
    332     UINT64  R4;
    333     UINT64  R5;
    334     UINT64  R6;
    335     UINT64  R7;
    336     UINT64  R8;
    337     UINT64  R9;
    338     UINT64  R10;
    339     UINT64  R11;
    340     UINT64  R12;
    341     UINT64  R13;
    342     UINT64  R14;
    343     UINT64  R15;
    344     UINT64  R16;
    345     UINT64  R17;
    346     UINT64  R18;
    347     UINT64  R19;
    348     UINT64  R20;
    349     UINT64  R21;
    350     UINT64  R22;
    351     UINT64  R23;
    352     UINT64  R24;
    353     UINT64  R25;
    354     UINT64  R26;
    355     UINT64  R27;
    356     UINT64  R28;
    357     UINT64  R29;
    358     UINT64  R30;
    359     UINT64  R31;
    360     UINT64  F2[2];
    361     UINT64  F3[2];
    362     UINT64  F4[2];
    363     UINT64  F5[2];
    364     UINT64  F6[2];
    365     UINT64  F7[2];
    366     UINT64  F8[2];
    367     UINT64  F9[2];
    368     UINT64  F10[2];
    369     UINT64  F11[2];
    370     UINT64  F12[2];
    371     UINT64  F13[2];
    372     UINT64  F14[2];
    373     UINT64  F15[2];
    374     UINT64  F16[2];
    375     UINT64  F17[2];
    376     UINT64  F18[2];
    377     UINT64  F19[2];
    378     UINT64  F20[2];
    379     UINT64  F21[2];
    380     UINT64  F22[2];
    381     UINT64  F23[2];
    382     UINT64  F24[2];
    383     UINT64  F25[2];
    384     UINT64  F26[2];
    385     UINT64  F27[2];
    386     UINT64  F28[2];
    387     UINT64  F29[2];
    388     UINT64  F30[2];
    389     UINT64  F31[2];
    390     UINT64  Pr;
    391     UINT64  B0;
    392     UINT64  B1;
    393     UINT64  B2;
    394     UINT64  B3;
    395     UINT64  B4;
    396     UINT64  B5;
    397     UINT64  B6;
    398     UINT64  B7;
    399     UINT64  ArRsc;
    400     UINT64  ArBsp;
    401     UINT64  ArBspstore;
    402     UINT64  ArRnat;
    403     UINT64  ArFcr;
    404     UINT64  ArEflag;
    405     UINT64  ArCsd;
    406     UINT64  ArSsd;
    407     UINT64  ArCflg;
    408     UINT64  ArFsr;
    409     UINT64  ArFir;
    410     UINT64  ArFdr;
    411     UINT64  ArCcv;
    412     UINT64  ArUnat;
    413     UINT64  ArFpsr;
    414     UINT64  ArPfs;
    415     UINT64  ArLc;
    416     UINT64  ArEc;
    417     UINT64  CrDcr;
    418     UINT64  CrItm;
    419     UINT64  CrIva;
    420     UINT64  CrPta;
    421     UINT64  CrIpsr;
    422     UINT64  CrIsr;
    423     UINT64  CrIip;
    424     UINT64  CrIfa;
    425     UINT64  CrItir;
    426     UINT64  CrIipa;
    427     UINT64  CrIfs;
    428     UINT64  CrIim;
    429     UINT64  CrIha;
    430     UINT64  Dbr0;
    431     UINT64  Dbr1;
    432     UINT64  Dbr2;
    433     UINT64  Dbr3;
    434     UINT64  Dbr4;
    435     UINT64  Dbr5;
    436     UINT64  Dbr6;
    437     UINT64  Dbr7;
    438     UINT64  Ibr0;
    439     UINT64  Ibr1;
    440     UINT64  Ibr2;
    441     UINT64  Ibr3;
    442     UINT64  Ibr4;
    443     UINT64  Ibr5;
    444     UINT64  Ibr6;
    445     UINT64  Ibr7;
    446     UINT64  IntNat;
    447 } EFI_SYSTEM_CONTEXT_IPF;
    448 
    449 // EBC
    450 #define EXCEPT_EBC_UNDEFINED            0
    451 #define EXCEPT_EBC_DIVIDE_ERROR         1
    452 #define EXCEPT_EBC_DEBUG                2
    453 #define EXCEPT_EBC_BREAKPOINT           3
    454 #define EXCEPT_EBC_OVERFLOW             4
    455 #define EXCEPT_EBC_INVALID_OPCODE       5
    456 #define EXCEPT_EBC_STACK_FAULT          6
    457 #define EXCEPT_EBC_ALIGNMENT_CHECK      7
    458 #define EXCEPT_EBC_INSTRUCTION_ENCODING 8
    459 #define EXCEPT_EBC_BAD_BREAK            9
    460 #define EXCEPT_EBC_STEP                 10
    461 #define MAX_EBC_EXCEPTION               EXCEPT_EBC_STEP
    462 
    463 typedef struct {
    464     UINT64  R0;
    465     UINT64  R1;
    466     UINT64  R2;
    467     UINT64  R3;
    468     UINT64  R4;
    469     UINT64  R5;
    470     UINT64  R6;
    471     UINT64  R7;
    472     UINT64  Flags;
    473     UINT64  ControlFlags;
    474     UINT64  Ip;
    475 } EFI_SYSTEM_CONTEXT_EBC;
    476 
    477 // ARM
    478 #define EXCEPT_ARM_RESET                    0
    479 #define EXCEPT_ARM_UNDEFINED_INSTRUCTION    1
    480 #define EXCEPT_ARM_SOFTWARE_INTERRUPT       2
    481 #define EXCEPT_ARM_PREFETCH_ABORT           3
    482 #define EXCEPT_ARM_DATA_ABORT               4
    483 #define EXCEPT_ARM_RESERVED                 5
    484 #define EXCEPT_ARM_IRQ                      6
    485 #define EXCEPT_ARM_FIQ                      7
    486 #define MAX_ARM_EXCEPTION                   EXCEPT_ARM_FIQ
    487 
    488 typedef struct {
    489     UINT32  R0;
    490     UINT32  R1;
    491     UINT32  R2;
    492     UINT32  R3;
    493     UINT32  R4;
    494     UINT32  R5;
    495     UINT32  R6;
    496     UINT32  R7;
    497     UINT32  R8;
    498     UINT32  R9;
    499     UINT32  R10;
    500     UINT32  R11;
    501     UINT32  R12;
    502     UINT32  SP;
    503     UINT32  LR;
    504     UINT32  PC;
    505     UINT32  CPSR;
    506     UINT32  DFSR;
    507     UINT32  DFAR;
    508     UINT32  IFSR;
    509     UINT32  IFAR;
    510 } EFI_SYSTEM_CONTEXT_ARM;
    511 
    512 
    513 typedef union {
    514     EFI_SYSTEM_CONTEXT_EBC  *SystemContextEbc;
    515     EFI_SYSTEM_CONTEXT_IA32 *SystemContextIa32;
    516     EFI_SYSTEM_CONTEXT_X64  *SystemContextX64;
    517     EFI_SYSTEM_CONTEXT_IPF  *SystemContextIpf;
    518     EFI_SYSTEM_CONTEXT_ARM  *SystemContextArm;
    519 } EFI_SYSTEM_CONTEXT;
    520 
    521 typedef
    522 VOID
    523 (EFIAPI *EFI_EXCEPTION_CALLBACK)(
    524     IN     EFI_EXCEPTION_TYPE               ExceptionType,
    525     IN OUT EFI_SYSTEM_CONTEXT               SystemContext);
    526 
    527 typedef
    528 VOID
    529 (EFIAPI *EFI_PERIODIC_CALLBACK)(
    530     IN OUT EFI_SYSTEM_CONTEXT               SystemContext);
    531 
    532 typedef enum {
    533     IsaIa32 = EFI_IMAGE_MACHINE_IA32,
    534     IsaX64 = EFI_IMAGE_MACHINE_X64,
    535     IsaIpf = EFI_IMAGE_MACHINE_IA64,
    536     IsaEbc = EFI_IMAGE_MACHINE_EBC,
    537     IsaArm = EFI_IMAGE_MACHINE_ARMTHUMB_MIXED,
    538 //	IsaArm64 = EFI_IMAGE_MACHINE_AARCH64
    539 } EFI_INSTRUCTION_SET_ARCHITECTURE;
    540 
    541 //
    542 // DEBUG_IMAGE_INFO
    543 //
    544 
    545 #define EFI_DEBUG_IMAGE_INFO_TABLE_GUID \
    546     { 0x49152e77, 0x1ada, 0x4764, {0xb7, 0xa2, 0x7a, 0xfe, 0xfe, 0xd9, 0x5e, 0x8b} }
    547 
    548 #define EFI_DEBUG_IMAGE_INFO_UPDATE_IN_PROGRESS 0x01
    549 #define EFI_DEBUG_IMAGE_INFO_TABLE_MODIFIED     0x02
    550 #define EFI_DEBUG_IMAGE_INFO_INITIAL_SIZE       (EFI_PAGE_SIZE / sizeof (UINTN))
    551 #define EFI_DEBUG_IMAGE_INFO_TYPE_NORMAL        0x01
    552 
    553 typedef struct {
    554 UINT64                Signature;
    555 EFI_PHYSICAL_ADDRESS  EfiSystemTableBase;
    556 UINT32                Crc32;
    557 } EFI_SYSTEM_TABLE_POINTER;
    558 
    559 typedef struct {
    560 UINT32                    ImageInfoType;
    561 EFI_LOADED_IMAGE_PROTOCOL *LoadedImageProtocolInstance;
    562 EFI_HANDLE                *ImageHandle;
    563 } EFI_DEBUG_IMAGE_INFO_NORMAL;
    564 
    565 typedef union {
    566 UINT32                      *ImageInfoType;
    567 EFI_DEBUG_IMAGE_INFO_NORMAL *NormalImage;
    568 } EFI_DEBUG_IMAGE_INFO;
    569 
    570 typedef struct {
    571 volatile UINT32       UpdateStatus;
    572 UINT32                TableSize;
    573 EFI_DEBUG_IMAGE_INFO  *EfiDebugImageInfoTable;
    574 } EFI_DEBUG_IMAGE_INFO_TABLE_HEADER;
    575 
    576 //
    577 // EFI_DEBUGGER_PROTOCOL
    578 //
    579 
    580 #define EFI_DEBUG_SUPPORT_PROTOCOL_GUID \
    581     { 0x2755590c, 0x6f3c, 0x42fa, {0x9e, 0xa4, 0xa3, 0xba, 0x54, 0x3c, 0xda, 0x25} }
    582 
    583 INTERFACE_DECL(_EFI_DEBUG_SUPPORT_PROTOCOL);
    584 
    585 typedef
    586 EFI_STATUS
    587 (EFIAPI *EFI_GET_MAXIMUM_PROCESSOR_INDEX)(
    588     IN struct _EFI_DEBUG_SUPPORT_PROTOCOL  *This,
    589     OUT UINTN                              *MaxProcessorIndex);
    590 
    591 typedef
    592 EFI_STATUS
    593 (EFIAPI *EFI_REGISTER_PERIODIC_CALLBACK)(
    594     IN struct _EFI_DEBUG_SUPPORT_PROTOCOL  *This,
    595     IN UINTN                               ProcessorIndex,
    596     IN EFI_PERIODIC_CALLBACK               PeriodicCallback);
    597 
    598 typedef
    599 EFI_STATUS
    600 (EFIAPI *EFI_REGISTER_EXCEPTION_CALLBACK)(
    601     IN struct _EFI_DEBUG_SUPPORT_PROTOCOL  *This,
    602     IN UINTN                               ProcessorIndex,
    603     IN EFI_EXCEPTION_CALLBACK              ExceptionCallback,
    604     IN EFI_EXCEPTION_TYPE                  ExceptionType);
    605 
    606 typedef
    607 EFI_STATUS
    608 (EFIAPI *EFI_INVALIDATE_INSTRUCTION_CACHE)(
    609     IN struct _EFI_DEBUG_SUPPORT_PROTOCOL  *This,
    610     IN UINTN                               ProcessorIndex,
    611     IN VOID                                *Start,
    612     IN UINT64                              Length);
    613 
    614 typedef struct _EFI_DEBUG_SUPPORT_PROTOCOL {
    615     EFI_INSTRUCTION_SET_ARCHITECTURE  Isa;
    616     EFI_GET_MAXIMUM_PROCESSOR_INDEX   GetMaximumProcessorIndex;
    617     EFI_REGISTER_PERIODIC_CALLBACK    RegisterPeriodicCallback;
    618     EFI_REGISTER_EXCEPTION_CALLBACK   RegisterExceptionCallback;
    619     EFI_INVALIDATE_INSTRUCTION_CACHE  InvalidateInstructionCache;
    620 } EFI_DEBUG_SUPPORT_PROTOCOL;
    621 
    622 #endif
    623