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