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
8Copyright (c) 1998  Intel Corporation
9
10Module Name:
11
12    efidebug.h
13
14Abstract:
15
16    EFI library debug functions
17
18
19
20Revision History
21
22--*/
23
24extern 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
97INTN
98DbgAssert (
99    CONST CHAR8   *file,
100    INTN          lineno,
101    CONST CHAR8   *string
102    );
103
104INTN
105DbgPrint (
106    INTN          mask,
107    CONST CHAR8   *format,
108    ...
109    );
110
111//
112// Instruction Set Architectures definitions for debuggers
113//
114
115typedef 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
136typedef 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
166typedef 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
221typedef 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
248typedef 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
327typedef 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
463typedef 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
488typedef 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
513typedef 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
521typedef
522VOID
523(EFIAPI *EFI_EXCEPTION_CALLBACK)(
524    IN     EFI_EXCEPTION_TYPE               ExceptionType,
525    IN OUT EFI_SYSTEM_CONTEXT               SystemContext);
526
527typedef
528VOID
529(EFIAPI *EFI_PERIODIC_CALLBACK)(
530    IN OUT EFI_SYSTEM_CONTEXT               SystemContext);
531
532typedef 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
553typedef struct {
554UINT64                Signature;
555EFI_PHYSICAL_ADDRESS  EfiSystemTableBase;
556UINT32                Crc32;
557} EFI_SYSTEM_TABLE_POINTER;
558
559typedef struct {
560UINT32                    ImageInfoType;
561EFI_LOADED_IMAGE_PROTOCOL *LoadedImageProtocolInstance;
562EFI_HANDLE                *ImageHandle;
563} EFI_DEBUG_IMAGE_INFO_NORMAL;
564
565typedef union {
566UINT32                      *ImageInfoType;
567EFI_DEBUG_IMAGE_INFO_NORMAL *NormalImage;
568} EFI_DEBUG_IMAGE_INFO;
569
570typedef struct {
571volatile UINT32       UpdateStatus;
572UINT32                TableSize;
573EFI_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
583INTERFACE_DECL(_EFI_DEBUG_SUPPORT_PROTOCOL);
584
585typedef
586EFI_STATUS
587(EFIAPI *EFI_GET_MAXIMUM_PROCESSOR_INDEX)(
588    IN struct _EFI_DEBUG_SUPPORT_PROTOCOL  *This,
589    OUT UINTN                              *MaxProcessorIndex);
590
591typedef
592EFI_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
598typedef
599EFI_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
606typedef
607EFI_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
614typedef 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