DebugSupport.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef __DEBUG_SUPPORT_H__
00020 #define __DEBUG_SUPPORT_H__
00021
00022 #include <gpxe/efi/ProcessorBind.h>
00023 #include <gpxe/efi/IndustryStandard/PeImage.h>
00024
00025 typedef struct _EFI_DEBUG_SUPPORT_PROTOCOL EFI_DEBUG_SUPPORT_PROTOCOL;
00026
00027
00028
00029
00030 #define EFI_DEBUG_SUPPORT_PROTOCOL_GUID \
00031 { \
00032 0x2755590C, 0x6F3C, 0x42FA, {0x9E, 0xA4, 0xA3, 0xBA, 0x54, 0x3C, 0xDA, 0x25 } \
00033 }
00034
00035
00036
00037
00038 typedef INTN EFI_EXCEPTION_TYPE;
00039
00040
00041
00042
00043 #define EXCEPT_IA32_DIVIDE_ERROR 0
00044 #define EXCEPT_IA32_DEBUG 1
00045 #define EXCEPT_IA32_NMI 2
00046 #define EXCEPT_IA32_BREAKPOINT 3
00047 #define EXCEPT_IA32_OVERFLOW 4
00048 #define EXCEPT_IA32_BOUND 5
00049 #define EXCEPT_IA32_INVALID_OPCODE 6
00050 #define EXCEPT_IA32_DOUBLE_FAULT 8
00051 #define EXCEPT_IA32_INVALID_TSS 10
00052 #define EXCEPT_IA32_SEG_NOT_PRESENT 11
00053 #define EXCEPT_IA32_STACK_FAULT 12
00054 #define EXCEPT_IA32_GP_FAULT 13
00055 #define EXCEPT_IA32_PAGE_FAULT 14
00056 #define EXCEPT_IA32_FP_ERROR 16
00057 #define EXCEPT_IA32_ALIGNMENT_CHECK 17
00058 #define EXCEPT_IA32_MACHINE_CHECK 18
00059 #define EXCEPT_IA32_SIMD 19
00060
00061
00062
00063
00064
00065
00066
00067
00068 typedef struct {
00069 UINT16 Fcw;
00070 UINT16 Fsw;
00071 UINT16 Ftw;
00072 UINT16 Opcode;
00073 UINT32 Eip;
00074 UINT16 Cs;
00075 UINT16 Reserved1;
00076 UINT32 DataOffset;
00077 UINT16 Ds;
00078 UINT8 Reserved2[10];
00079 UINT8 St0Mm0[10], Reserved3[6];
00080 UINT8 St1Mm1[10], Reserved4[6];
00081 UINT8 St2Mm2[10], Reserved5[6];
00082 UINT8 St3Mm3[10], Reserved6[6];
00083 UINT8 St4Mm4[10], Reserved7[6];
00084 UINT8 St5Mm5[10], Reserved8[6];
00085 UINT8 St6Mm6[10], Reserved9[6];
00086 UINT8 St7Mm7[10], Reserved10[6];
00087 UINT8 Xmm0[16];
00088 UINT8 Xmm1[16];
00089 UINT8 Xmm2[16];
00090 UINT8 Xmm3[16];
00091 UINT8 Xmm4[16];
00092 UINT8 Xmm5[16];
00093 UINT8 Xmm6[16];
00094 UINT8 Xmm7[16];
00095 UINT8 Reserved11[14 * 16];
00096 } EFI_FX_SAVE_STATE_IA32;
00097
00098 typedef struct {
00099 UINT32 ExceptionData;
00100 EFI_FX_SAVE_STATE_IA32 FxSaveState;
00101 UINT32 Dr0;
00102 UINT32 Dr1;
00103 UINT32 Dr2;
00104 UINT32 Dr3;
00105 UINT32 Dr6;
00106 UINT32 Dr7;
00107 UINT32 Cr0;
00108 UINT32 Cr1;
00109 UINT32 Cr2;
00110 UINT32 Cr3;
00111 UINT32 Cr4;
00112 UINT32 Eflags;
00113 UINT32 Ldtr;
00114 UINT32 Tr;
00115 UINT32 Gdtr[2];
00116 UINT32 Idtr[2];
00117 UINT32 Eip;
00118 UINT32 Gs;
00119 UINT32 Fs;
00120 UINT32 Es;
00121 UINT32 Ds;
00122 UINT32 Cs;
00123 UINT32 Ss;
00124 UINT32 Edi;
00125 UINT32 Esi;
00126 UINT32 Ebp;
00127 UINT32 Esp;
00128 UINT32 Ebx;
00129 UINT32 Edx;
00130 UINT32 Ecx;
00131 UINT32 Eax;
00132 } EFI_SYSTEM_CONTEXT_IA32;
00133
00134
00135
00136
00137 #define EXCEPT_X64_DIVIDE_ERROR 0
00138 #define EXCEPT_X64_DEBUG 1
00139 #define EXCEPT_X64_NMI 2
00140 #define EXCEPT_X64_BREAKPOINT 3
00141 #define EXCEPT_X64_OVERFLOW 4
00142 #define EXCEPT_X64_BOUND 5
00143 #define EXCEPT_X64_INVALID_OPCODE 6
00144 #define EXCEPT_X64_DOUBLE_FAULT 8
00145 #define EXCEPT_X64_INVALID_TSS 10
00146 #define EXCEPT_X64_SEG_NOT_PRESENT 11
00147 #define EXCEPT_X64_STACK_FAULT 12
00148 #define EXCEPT_X64_GP_FAULT 13
00149 #define EXCEPT_X64_PAGE_FAULT 14
00150 #define EXCEPT_X64_FP_ERROR 16
00151 #define EXCEPT_X64_ALIGNMENT_CHECK 17
00152 #define EXCEPT_X64_MACHINE_CHECK 18
00153 #define EXCEPT_X64_SIMD 19
00154
00155
00156
00157
00158
00159
00160
00161 typedef struct {
00162 UINT16 Fcw;
00163 UINT16 Fsw;
00164 UINT16 Ftw;
00165 UINT16 Opcode;
00166 UINT64 Rip;
00167 UINT64 DataOffset;
00168 UINT8 Reserved1[8];
00169 UINT8 St0Mm0[10], Reserved2[6];
00170 UINT8 St1Mm1[10], Reserved3[6];
00171 UINT8 St2Mm2[10], Reserved4[6];
00172 UINT8 St3Mm3[10], Reserved5[6];
00173 UINT8 St4Mm4[10], Reserved6[6];
00174 UINT8 St5Mm5[10], Reserved7[6];
00175 UINT8 St6Mm6[10], Reserved8[6];
00176 UINT8 St7Mm7[10], Reserved9[6];
00177 UINT8 Xmm0[16];
00178 UINT8 Xmm1[16];
00179 UINT8 Xmm2[16];
00180 UINT8 Xmm3[16];
00181 UINT8 Xmm4[16];
00182 UINT8 Xmm5[16];
00183 UINT8 Xmm6[16];
00184 UINT8 Xmm7[16];
00185
00186
00187
00188 UINT8 Reserved11[14 * 16];
00189 } EFI_FX_SAVE_STATE_X64;
00190
00191 typedef struct {
00192 UINT64 ExceptionData;
00193 EFI_FX_SAVE_STATE_X64 FxSaveState;
00194 UINT64 Dr0;
00195 UINT64 Dr1;
00196 UINT64 Dr2;
00197 UINT64 Dr3;
00198 UINT64 Dr6;
00199 UINT64 Dr7;
00200 UINT64 Cr0;
00201 UINT64 Cr1;
00202 UINT64 Cr2;
00203 UINT64 Cr3;
00204 UINT64 Cr4;
00205 UINT64 Cr8;
00206 UINT64 Rflags;
00207 UINT64 Ldtr;
00208 UINT64 Tr;
00209 UINT64 Gdtr[2];
00210 UINT64 Idtr[2];
00211 UINT64 Rip;
00212 UINT64 Gs;
00213 UINT64 Fs;
00214 UINT64 Es;
00215 UINT64 Ds;
00216 UINT64 Cs;
00217 UINT64 Ss;
00218 UINT64 Rdi;
00219 UINT64 Rsi;
00220 UINT64 Rbp;
00221 UINT64 Rsp;
00222 UINT64 Rbx;
00223 UINT64 Rdx;
00224 UINT64 Rcx;
00225 UINT64 Rax;
00226 UINT64 R8;
00227 UINT64 R9;
00228 UINT64 R10;
00229 UINT64 R11;
00230 UINT64 R12;
00231 UINT64 R13;
00232 UINT64 R14;
00233 UINT64 R15;
00234 } EFI_SYSTEM_CONTEXT_X64;
00235
00236
00237
00238
00239 #define EXCEPT_IPF_VHTP_TRANSLATION 0
00240 #define EXCEPT_IPF_INSTRUCTION_TLB 1
00241 #define EXCEPT_IPF_DATA_TLB 2
00242 #define EXCEPT_IPF_ALT_INSTRUCTION_TLB 3
00243 #define EXCEPT_IPF_ALT_DATA_TLB 4
00244 #define EXCEPT_IPF_DATA_NESTED_TLB 5
00245 #define EXCEPT_IPF_INSTRUCTION_KEY_MISSED 6
00246 #define EXCEPT_IPF_DATA_KEY_MISSED 7
00247 #define EXCEPT_IPF_DIRTY_BIT 8
00248 #define EXCEPT_IPF_INSTRUCTION_ACCESS_BIT 9
00249 #define EXCEPT_IPF_DATA_ACCESS_BIT 10
00250 #define EXCEPT_IPF_BREAKPOINT 11
00251 #define EXCEPT_IPF_EXTERNAL_INTERRUPT 12
00252
00253
00254
00255 #define EXCEPT_IPF_PAGE_NOT_PRESENT 20
00256 #define EXCEPT_IPF_KEY_PERMISSION 21
00257 #define EXCEPT_IPF_INSTRUCTION_ACCESS_RIGHTS 22
00258 #define EXCEPT_IPF_DATA_ACCESS_RIGHTS 23
00259 #define EXCEPT_IPF_GENERAL_EXCEPTION 24
00260 #define EXCEPT_IPF_DISABLED_FP_REGISTER 25
00261 #define EXCEPT_IPF_NAT_CONSUMPTION 26
00262 #define EXCEPT_IPF_SPECULATION 27
00263
00264
00265
00266 #define EXCEPT_IPF_DEBUG 29
00267 #define EXCEPT_IPF_UNALIGNED_REFERENCE 30
00268 #define EXCEPT_IPF_UNSUPPORTED_DATA_REFERENCE 31
00269 #define EXCEPT_IPF_FP_FAULT 32
00270 #define EXCEPT_IPF_FP_TRAP 33
00271 #define EXCEPT_IPF_LOWER_PRIVILEGE_TRANSFER_TRAP 34
00272 #define EXCEPT_IPF_TAKEN_BRANCH 35
00273 #define EXCEPT_IPF_SINGLE_STEP 36
00274
00275
00276
00277 #define EXCEPT_IPF_IA32_EXCEPTION 45
00278 #define EXCEPT_IPF_IA32_INTERCEPT 46
00279 #define EXCEPT_IPF_IA32_INTERRUPT 47
00280
00281
00282
00283
00284 typedef struct {
00285
00286
00287
00288
00289 UINT64 Reserved;
00290 UINT64 R1;
00291 UINT64 R2;
00292 UINT64 R3;
00293 UINT64 R4;
00294 UINT64 R5;
00295 UINT64 R6;
00296 UINT64 R7;
00297 UINT64 R8;
00298 UINT64 R9;
00299 UINT64 R10;
00300 UINT64 R11;
00301 UINT64 R12;
00302 UINT64 R13;
00303 UINT64 R14;
00304 UINT64 R15;
00305 UINT64 R16;
00306 UINT64 R17;
00307 UINT64 R18;
00308 UINT64 R19;
00309 UINT64 R20;
00310 UINT64 R21;
00311 UINT64 R22;
00312 UINT64 R23;
00313 UINT64 R24;
00314 UINT64 R25;
00315 UINT64 R26;
00316 UINT64 R27;
00317 UINT64 R28;
00318 UINT64 R29;
00319 UINT64 R30;
00320 UINT64 R31;
00321
00322 UINT64 F2[2];
00323 UINT64 F3[2];
00324 UINT64 F4[2];
00325 UINT64 F5[2];
00326 UINT64 F6[2];
00327 UINT64 F7[2];
00328 UINT64 F8[2];
00329 UINT64 F9[2];
00330 UINT64 F10[2];
00331 UINT64 F11[2];
00332 UINT64 F12[2];
00333 UINT64 F13[2];
00334 UINT64 F14[2];
00335 UINT64 F15[2];
00336 UINT64 F16[2];
00337 UINT64 F17[2];
00338 UINT64 F18[2];
00339 UINT64 F19[2];
00340 UINT64 F20[2];
00341 UINT64 F21[2];
00342 UINT64 F22[2];
00343 UINT64 F23[2];
00344 UINT64 F24[2];
00345 UINT64 F25[2];
00346 UINT64 F26[2];
00347 UINT64 F27[2];
00348 UINT64 F28[2];
00349 UINT64 F29[2];
00350 UINT64 F30[2];
00351 UINT64 F31[2];
00352
00353 UINT64 Pr;
00354
00355 UINT64 B0;
00356 UINT64 B1;
00357 UINT64 B2;
00358 UINT64 B3;
00359 UINT64 B4;
00360 UINT64 B5;
00361 UINT64 B6;
00362 UINT64 B7;
00363
00364
00365
00366
00367 UINT64 ArRsc;
00368 UINT64 ArBsp;
00369 UINT64 ArBspstore;
00370 UINT64 ArRnat;
00371
00372 UINT64 ArFcr;
00373
00374 UINT64 ArEflag;
00375 UINT64 ArCsd;
00376 UINT64 ArSsd;
00377 UINT64 ArCflg;
00378 UINT64 ArFsr;
00379 UINT64 ArFir;
00380 UINT64 ArFdr;
00381
00382 UINT64 ArCcv;
00383
00384 UINT64 ArUnat;
00385
00386 UINT64 ArFpsr;
00387
00388 UINT64 ArPfs;
00389 UINT64 ArLc;
00390 UINT64 ArEc;
00391
00392
00393
00394
00395 UINT64 CrDcr;
00396 UINT64 CrItm;
00397 UINT64 CrIva;
00398 UINT64 CrPta;
00399 UINT64 CrIpsr;
00400 UINT64 CrIsr;
00401 UINT64 CrIip;
00402 UINT64 CrIfa;
00403 UINT64 CrItir;
00404 UINT64 CrIipa;
00405 UINT64 CrIfs;
00406 UINT64 CrIim;
00407 UINT64 CrIha;
00408
00409
00410
00411
00412 UINT64 Dbr0;
00413 UINT64 Dbr1;
00414 UINT64 Dbr2;
00415 UINT64 Dbr3;
00416 UINT64 Dbr4;
00417 UINT64 Dbr5;
00418 UINT64 Dbr6;
00419 UINT64 Dbr7;
00420
00421 UINT64 Ibr0;
00422 UINT64 Ibr1;
00423 UINT64 Ibr2;
00424 UINT64 Ibr3;
00425 UINT64 Ibr4;
00426 UINT64 Ibr5;
00427 UINT64 Ibr6;
00428 UINT64 Ibr7;
00429
00430
00431
00432
00433 UINT64 IntNat;
00434
00435 } EFI_SYSTEM_CONTEXT_IPF;
00436
00437
00438
00439
00440 #define EXCEPT_EBC_UNDEFINED 0
00441 #define EXCEPT_EBC_DIVIDE_ERROR 1
00442 #define EXCEPT_EBC_DEBUG 2
00443 #define EXCEPT_EBC_BREAKPOINT 3
00444 #define EXCEPT_EBC_OVERFLOW 4
00445 #define EXCEPT_EBC_INVALID_OPCODE 5 // opcode out of range
00446 #define EXCEPT_EBC_STACK_FAULT 6
00447 #define EXCEPT_EBC_ALIGNMENT_CHECK 7
00448 #define EXCEPT_EBC_INSTRUCTION_ENCODING 8 // malformed instruction
00449 #define EXCEPT_EBC_BAD_BREAK 9 // BREAK 0 or undefined BREAK
00450 #define EXCEPT_EBC_STEP 10 // to support debug stepping
00451
00452
00453
00454 #define MAX_EBC_EXCEPTION EXCEPT_EBC_STEP
00455
00456
00457
00458
00459 typedef struct {
00460 UINT64 R0;
00461 UINT64 R1;
00462 UINT64 R2;
00463 UINT64 R3;
00464 UINT64 R4;
00465 UINT64 R5;
00466 UINT64 R6;
00467 UINT64 R7;
00468 UINT64 Flags;
00469 UINT64 ControlFlags;
00470 UINT64 Ip;
00471 } EFI_SYSTEM_CONTEXT_EBC;
00472
00473
00474
00475
00476 typedef union {
00477 EFI_SYSTEM_CONTEXT_EBC *SystemContextEbc;
00478 EFI_SYSTEM_CONTEXT_IA32 *SystemContextIa32;
00479 EFI_SYSTEM_CONTEXT_X64 *SystemContextX64;
00480 EFI_SYSTEM_CONTEXT_IPF *SystemContextIpf;
00481 } EFI_SYSTEM_CONTEXT;
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494 typedef
00495 VOID
00496 (*EFI_EXCEPTION_CALLBACK)(
00497 IN EFI_EXCEPTION_TYPE ExceptionType,
00498 IN OUT EFI_SYSTEM_CONTEXT SystemContext
00499 );
00500
00501
00502
00503
00504
00505
00506
00507 typedef
00508 VOID
00509 (*EFI_PERIODIC_CALLBACK)(
00510 IN OUT EFI_SYSTEM_CONTEXT SystemContext
00511 );
00512
00513
00514
00515
00516 typedef enum {
00517 IsaIa32 = IMAGE_FILE_MACHINE_I386,
00518 IsaX64 = IMAGE_FILE_MACHINE_X64,
00519 IsaIpf = IMAGE_FILE_MACHINE_IA64,
00520 IsaEbc = IMAGE_FILE_MACHINE_EBC
00521 } EFI_INSTRUCTION_SET_ARCHITECTURE;
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539 typedef
00540 EFI_STATUS
00541 (EFIAPI *EFI_GET_MAXIMUM_PROCESSOR_INDEX)(
00542 IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
00543 OUT UINTN *MaxProcessorIndex
00544 );
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561 typedef
00562 EFI_STATUS
00563 (EFIAPI *EFI_REGISTER_PERIODIC_CALLBACK)(
00564 IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
00565 IN UINTN ProcessorIndex,
00566 IN EFI_PERIODIC_CALLBACK PeriodicCallback
00567 );
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581
00582
00583
00584
00585 typedef
00586 EFI_STATUS
00587 (EFIAPI *EFI_REGISTER_EXCEPTION_CALLBACK)(
00588 IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
00589 IN UINTN ProcessorIndex,
00590 IN EFI_EXCEPTION_CALLBACK ExceptionCallback,
00591 IN EFI_EXCEPTION_TYPE ExceptionType
00592 );
00593
00594
00595
00596
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607 typedef
00608 EFI_STATUS
00609 (EFIAPI *EFI_INVALIDATE_INSTRUCTION_CACHE)(
00610 IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
00611 IN UINTN ProcessorIndex,
00612 IN VOID *Start,
00613 IN UINT64 Length
00614 );
00615
00616
00617
00618
00619
00620
00621 struct _EFI_DEBUG_SUPPORT_PROTOCOL {
00622
00623
00624
00625 EFI_INSTRUCTION_SET_ARCHITECTURE Isa;
00626 EFI_GET_MAXIMUM_PROCESSOR_INDEX GetMaximumProcessorIndex;
00627 EFI_REGISTER_PERIODIC_CALLBACK RegisterPeriodicCallback;
00628 EFI_REGISTER_EXCEPTION_CALLBACK RegisterExceptionCallback;
00629 EFI_INVALIDATE_INSTRUCTION_CACHE InvalidateInstructionCache;
00630 };
00631
00632 extern EFI_GUID gEfiDebugSupportProtocolGuid;
00633
00634 #endif