xref: /freebsd/sys/contrib/edk2/Include/Protocol/DebugSupport.h (revision f439973d6726c3be929c8fb3b1545b8b1744abc3)
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_VS_MODE         10
617 #define EXCEPT_RISCV_ENV_CALL_FROM_MMODE           11
618 #define EXCEPT_RISCV_INST_ACCESS_PAGE_FAULT        12
619 #define EXCEPT_RISCV_LOAD_ACCESS_PAGE_FAULT        13
620 #define EXCEPT_RISCV_14                            14
621 #define EXCEPT_RISCV_STORE_ACCESS_PAGE_FAULT       15
622 #define EXCEPT_RISCV_16                            16
623 #define EXCEPT_RISCV_17                            17
624 #define EXCEPT_RISCV_18                            18
625 #define EXCEPT_RISCV_19                            19
626 #define EXCEPT_RISCV_INST_GUEST_PAGE_FAULT         20
627 #define EXCEPT_RISCV_LOAD_GUEST_PAGE_FAULT         21
628 #define EXCEPT_RISCV_VIRTUAL_INSTRUCTION           22
629 #define EXCEPT_RISCV_STORE_GUEST_PAGE_FAULT        23
630 #define EXCEPT_RISCV_MAX_EXCEPTIONS                (EXCEPT_RISCV_STORE_GUEST_PAGE_FAULT)
631 
632 ///
633 /// RISC-V processor exception types for interrupts.
634 ///
635 #define EXCEPT_RISCV_IS_IRQ(x)     ((x & 0x8000000000000000UL) != 0)
636 #define EXCEPT_RISCV_IRQ_INDEX(x)  (x & 0x7FFFFFFFFFFFFFFFUL)
637 #define EXCEPT_RISCV_IRQ_0                 0x8000000000000000UL
638 #define EXCEPT_RISCV_IRQ_SOFT_FROM_SMODE   0x8000000000000001UL
639 #define EXCEPT_RISCV_IRQ_SOFT_FROM_VSMODE  0x8000000000000002UL
640 #define EXCEPT_RISCV_IRQ_SOFT_FROM_MMODE   0x8000000000000003UL
641 #define EXCEPT_RISCV_IRQ_4                 0x8000000000000004UL
642 #define EXCEPT_RISCV_IRQ_TIMER_FROM_SMODE  0x8000000000000005UL
643 #define EXCEPT_RISCV_MAX_IRQS              (EXCEPT_RISCV_IRQ_INDEX(EXCEPT_RISCV_IRQ_TIMER_FROM_SMODE))
644 
645 typedef struct {
646   UINT64    X0;
647   UINT64    X1;
648   UINT64    X2;
649   UINT64    X3;
650   UINT64    X4;
651   UINT64    X5;
652   UINT64    X6;
653   UINT64    X7;
654   UINT64    X8;
655   UINT64    X9;
656   UINT64    X10;
657   UINT64    X11;
658   UINT64    X12;
659   UINT64    X13;
660   UINT64    X14;
661   UINT64    X15;
662   UINT64    X16;
663   UINT64    X17;
664   UINT64    X18;
665   UINT64    X19;
666   UINT64    X20;
667   UINT64    X21;
668   UINT64    X22;
669   UINT64    X23;
670   UINT64    X24;
671   UINT64    X25;
672   UINT64    X26;
673   UINT64    X27;
674   UINT64    X28;
675   UINT64    X29;
676   UINT64    X30;
677   UINT64    X31;
678   UINT64    SEPC;
679   UINT32    SSTATUS;
680   UINT32    STVAL;
681 } EFI_SYSTEM_CONTEXT_RISCV64;
682 
683 ///
684 /// LoongArch processor exception types.
685 ///
686 /// The exception types is located in the CSR ESTAT
687 /// register offset 16 bits, width 6 bits.
688 ///
689 /// If you want to register an exception hook, you can
690 /// shfit the number left by 16 bits, and the exception
691 /// handler will know the types.
692 ///
693 /// For example:
694 /// mCpu->CpuRegisterInterruptHandler (
695 ///         mCpu,
696 ///         (EXCEPT_LOONGARCH_PPI << CSR_ESTAT_EXC_SHIFT),
697 ///         PpiExceptionHandler
698 ///         );
699 ///
700 #define EXCEPT_LOONGARCH_INT   0
701 #define EXCEPT_LOONGARCH_PIL   1
702 #define EXCEPT_LOONGARCH_PIS   2
703 #define EXCEPT_LOONGARCH_PIF   3
704 #define EXCEPT_LOONGARCH_PME   4
705 #define EXCEPT_LOONGARCH_PNR   5
706 #define EXCEPT_LOONGARCH_PNX   6
707 #define EXCEPT_LOONGARCH_PPI   7
708 #define EXCEPT_LOONGARCH_ADE   8
709 #define EXCEPT_LOONGARCH_ALE   9
710 #define EXCEPT_LOONGARCH_BCE   10
711 #define EXCEPT_LOONGARCH_SYS   11
712 #define EXCEPT_LOONGARCH_BRK   12
713 #define EXCEPT_LOONGARCH_INE   13
714 #define EXCEPT_LOONGARCH_IPE   14
715 #define EXCEPT_LOONGARCH_FPD   15
716 #define EXCEPT_LOONGARCH_SXD   16
717 #define EXCEPT_LOONGARCH_ASXD  17
718 #define EXCEPT_LOONGARCH_FPE   18
719 #define EXCEPT_LOONGARCH_WPE   19
720 #define EXCEPT_LOONGARCH_BTD   20
721 #define EXCEPT_LOONGARCH_BTE   21
722 #define EXCEPT_LOONGARCH_GSPR  22
723 #define EXCEPT_LOONGARCH_HVC   23
724 #define EXCEPT_LOONGARCH_GCXC  24
725 
726 ///
727 /// For coding convenience, define the maximum valid
728 /// LoongArch exception.
729 ///
730 #define MAX_LOONGARCH_EXCEPTION  64
731 
732 ///
733 /// LoongArch processor Interrupt types.
734 ///
735 #define EXCEPT_LOONGARCH_INT_SIP0   0
736 #define EXCEPT_LOONGARCH_INT_SIP1   1
737 #define EXCEPT_LOONGARCH_INT_IP0    2
738 #define EXCEPT_LOONGARCH_INT_IP1    3
739 #define EXCEPT_LOONGARCH_INT_IP2    4
740 #define EXCEPT_LOONGARCH_INT_IP3    5
741 #define EXCEPT_LOONGARCH_INT_IP4    6
742 #define EXCEPT_LOONGARCH_INT_IP5    7
743 #define EXCEPT_LOONGARCH_INT_IP6    8
744 #define EXCEPT_LOONGARCH_INT_IP7    9
745 #define EXCEPT_LOONGARCH_INT_PMC    10
746 #define EXCEPT_LOONGARCH_INT_TIMER  11
747 #define EXCEPT_LOONGARCH_INT_IPI    12
748 
749 ///
750 /// For coding convenience, define the maximum valid
751 /// LoongArch interrupt.
752 ///
753 #define MAX_LOONGARCH_INTERRUPT  16
754 
755 typedef struct {
756   UINT64    R0;
757   UINT64    R1;
758   UINT64    R2;
759   UINT64    R3;
760   UINT64    R4;
761   UINT64    R5;
762   UINT64    R6;
763   UINT64    R7;
764   UINT64    R8;
765   UINT64    R9;
766   UINT64    R10;
767   UINT64    R11;
768   UINT64    R12;
769   UINT64    R13;
770   UINT64    R14;
771   UINT64    R15;
772   UINT64    R16;
773   UINT64    R17;
774   UINT64    R18;
775   UINT64    R19;
776   UINT64    R20;
777   UINT64    R21;
778   UINT64    R22;
779   UINT64    R23;
780   UINT64    R24;
781   UINT64    R25;
782   UINT64    R26;
783   UINT64    R27;
784   UINT64    R28;
785   UINT64    R29;
786   UINT64    R30;
787   UINT64    R31;
788 
789   UINT64    CRMD;  // CuRrent MoDe information
790   UINT64    PRMD;  // PRe-exception MoDe information
791   UINT64    EUEN;  // Extended component Unit ENable
792   UINT64    MISC;  // MISCellaneous controller
793   UINT64    ECFG;  // Exception ConFiGuration
794   UINT64    ESTAT; // Exception STATus
795   UINT64    ERA;   // Exception Return Address
796   UINT64    BADV;  // BAD Virtual address
797   UINT64    BADI;  // BAD Instruction
798 } EFI_SYSTEM_CONTEXT_LOONGARCH64;
799 
800 ///
801 /// Universal EFI_SYSTEM_CONTEXT definition.
802 ///
803 typedef union {
804   EFI_SYSTEM_CONTEXT_EBC            *SystemContextEbc;
805   EFI_SYSTEM_CONTEXT_IA32           *SystemContextIa32;
806   EFI_SYSTEM_CONTEXT_X64            *SystemContextX64;
807   EFI_SYSTEM_CONTEXT_IPF            *SystemContextIpf;
808   EFI_SYSTEM_CONTEXT_ARM            *SystemContextArm;
809   EFI_SYSTEM_CONTEXT_AARCH64        *SystemContextAArch64;
810   EFI_SYSTEM_CONTEXT_RISCV64        *SystemContextRiscV64;
811   EFI_SYSTEM_CONTEXT_LOONGARCH64    *SystemContextLoongArch64;
812 } EFI_SYSTEM_CONTEXT;
813 
814 //
815 // DebugSupport callback function prototypes
816 //
817 
818 /**
819   Registers and enables an exception callback function for the specified exception.
820 
821   @param  ExceptionType         Exception types in EBC, IA-32, x64, or IPF.
822   @param  SystemContext         Exception content.
823 
824 **/
825 typedef
826 VOID
827 (EFIAPI *EFI_EXCEPTION_CALLBACK)(
828   IN     EFI_EXCEPTION_TYPE               ExceptionType,
829   IN OUT EFI_SYSTEM_CONTEXT               SystemContext
830   );
831 
832 /**
833   Registers and enables the on-target debug agent's periodic entry point.
834 
835   @param  SystemContext         Exception content.
836 
837 **/
838 typedef
839 VOID
840 (EFIAPI *EFI_PERIODIC_CALLBACK)(
841   IN OUT EFI_SYSTEM_CONTEXT               SystemContext
842   );
843 
844 ///
845 /// Machine type definition
846 ///
847 typedef enum {
848   IsaIa32    = IMAGE_FILE_MACHINE_I386,           ///< 0x014C
849   IsaX64     = IMAGE_FILE_MACHINE_X64,            ///< 0x8664
850   IsaIpf     = IMAGE_FILE_MACHINE_IA64,           ///< 0x0200
851   IsaEbc     = IMAGE_FILE_MACHINE_EBC,            ///< 0x0EBC
852   IsaArm     = IMAGE_FILE_MACHINE_ARMTHUMB_MIXED, ///< 0x01c2
853   IsaAArch64 = IMAGE_FILE_MACHINE_ARM64           ///< 0xAA64
854 } EFI_INSTRUCTION_SET_ARCHITECTURE;
855 
856 //
857 // DebugSupport member function definitions
858 //
859 
860 /**
861   Returns the maximum value that may be used for the ProcessorIndex parameter in
862   RegisterPeriodicCallback() and RegisterExceptionCallback().
863 
864   @param  This                  A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.
865   @param  MaxProcessorIndex     Pointer to a caller-allocated UINTN in which the maximum supported
866                                 processor index is returned.
867 
868   @retval EFI_SUCCESS           The function completed successfully.
869 
870 **/
871 typedef
872 EFI_STATUS
873 (EFIAPI *EFI_GET_MAXIMUM_PROCESSOR_INDEX)(
874   IN EFI_DEBUG_SUPPORT_PROTOCOL          *This,
875   OUT UINTN                              *MaxProcessorIndex
876   );
877 
878 /**
879   Registers a function to be called back periodically in interrupt context.
880 
881   @param  This                  A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.
882   @param  ProcessorIndex        Specifies which processor the callback function applies to.
883   @param  PeriodicCallback      A pointer to a function of type PERIODIC_CALLBACK that is the main
884                                 periodic entry point of the debug agent.
885 
886   @retval EFI_SUCCESS           The function completed successfully.
887   @retval EFI_ALREADY_STARTED   Non-NULL PeriodicCallback parameter when a callback
888                                 function was previously registered.
889   @retval EFI_OUT_OF_RESOURCES  System has insufficient memory resources to register new callback
890                                 function.
891 
892 **/
893 typedef
894 EFI_STATUS
895 (EFIAPI *EFI_REGISTER_PERIODIC_CALLBACK)(
896   IN EFI_DEBUG_SUPPORT_PROTOCOL          *This,
897   IN UINTN                               ProcessorIndex,
898   IN EFI_PERIODIC_CALLBACK               PeriodicCallback
899   );
900 
901 /**
902   Registers a function to be called when a given processor exception occurs.
903 
904   @param  This                  A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.
905   @param  ProcessorIndex        Specifies which processor the callback function applies to.
906   @param  ExceptionCallback     A pointer to a function of type EXCEPTION_CALLBACK that is called
907                                 when the processor exception specified by ExceptionType occurs.
908   @param  ExceptionType         Specifies which processor exception to hook.
909 
910   @retval EFI_SUCCESS           The function completed successfully.
911   @retval EFI_ALREADY_STARTED   Non-NULL PeriodicCallback parameter when a callback
912                                 function was previously registered.
913   @retval EFI_OUT_OF_RESOURCES  System has insufficient memory resources to register new callback
914                                 function.
915 
916 **/
917 typedef
918 EFI_STATUS
919 (EFIAPI *EFI_REGISTER_EXCEPTION_CALLBACK)(
920   IN EFI_DEBUG_SUPPORT_PROTOCOL          *This,
921   IN UINTN                               ProcessorIndex,
922   IN EFI_EXCEPTION_CALLBACK              ExceptionCallback,
923   IN EFI_EXCEPTION_TYPE                  ExceptionType
924   );
925 
926 /**
927   Invalidates processor instruction cache for a memory range. Subsequent execution in this range
928   causes a fresh memory fetch to retrieve code to be executed.
929 
930   @param  This                  A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.
931   @param  ProcessorIndex        Specifies which processor's instruction cache is to be invalidated.
932   @param  Start                 Specifies the physical base of the memory range to be invalidated.
933   @param  Length                Specifies the minimum number of bytes in the processor's instruction
934                                 cache to invalidate.
935 
936   @retval EFI_SUCCESS           The function completed successfully.
937 
938 **/
939 typedef
940 EFI_STATUS
941 (EFIAPI *EFI_INVALIDATE_INSTRUCTION_CACHE)(
942   IN EFI_DEBUG_SUPPORT_PROTOCOL          *This,
943   IN UINTN                               ProcessorIndex,
944   IN VOID                                *Start,
945   IN UINT64                              Length
946   );
947 
948 ///
949 /// This protocol provides the services to allow the debug agent to register
950 /// callback functions that are called either periodically or when specific
951 /// processor exceptions occur.
952 ///
953 struct _EFI_DEBUG_SUPPORT_PROTOCOL {
954   ///
955   /// Declares the processor architecture for this instance of the EFI Debug Support protocol.
956   ///
957   EFI_INSTRUCTION_SET_ARCHITECTURE    Isa;
958   EFI_GET_MAXIMUM_PROCESSOR_INDEX     GetMaximumProcessorIndex;
959   EFI_REGISTER_PERIODIC_CALLBACK      RegisterPeriodicCallback;
960   EFI_REGISTER_EXCEPTION_CALLBACK     RegisterExceptionCallback;
961   EFI_INVALIDATE_INSTRUCTION_CACHE    InvalidateInstructionCache;
962 };
963 
964 extern EFI_GUID  gEfiDebugSupportProtocolGuid;
965 
966 #endif
967