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