Browse Source

Add Debugger protocol support.

Signed-off-by: Pete Batard <pete@akeo.ie>
Signed-off-by: Nigel Croxon <nigel.croxon@hpe.com>
Nigel Croxon 8 years ago
parent
commit
b14cc9cb4f
3 changed files with 519 additions and 1 deletions
  1. 511 1
      inc/efidebug.h
  2. 3 0
      inc/efilib.h
  3. 5 0
      lib/data.c

+ 511 - 1
inc/efidebug.h

@@ -106,5 +106,515 @@ DbgPrint (
     ...
     );
 
-#endif
+//
+// Instruction Set Architectures definitions for debuggers
+//
+
+typedef INTN EFI_EXCEPTION_TYPE;
+
+// IA32
+#define EXCEPT_IA32_DIVIDE_ERROR    0
+#define EXCEPT_IA32_DEBUG           1
+#define EXCEPT_IA32_NMI             2
+#define EXCEPT_IA32_BREAKPOINT      3
+#define EXCEPT_IA32_OVERFLOW        4
+#define EXCEPT_IA32_BOUND           5
+#define EXCEPT_IA32_INVALID_OPCODE  6
+#define EXCEPT_IA32_DOUBLE_FAULT    8
+#define EXCEPT_IA32_INVALID_TSS     10
+#define EXCEPT_IA32_SEG_NOT_PRESENT 11
+#define EXCEPT_IA32_STACK_FAULT     12
+#define EXCEPT_IA32_GP_FAULT        13
+#define EXCEPT_IA32_PAGE_FAULT      14
+#define EXCEPT_IA32_FP_ERROR        16
+#define EXCEPT_IA32_ALIGNMENT_CHECK 17
+#define EXCEPT_IA32_MACHINE_CHECK   18
+#define EXCEPT_IA32_SIMD            19
+
+typedef struct {
+    UINT16  Fcw;
+    UINT16  Fsw;
+    UINT16  Ftw;
+    UINT16  Opcode;
+    UINT32  Eip;
+    UINT16  Cs;
+    UINT16  Reserved1;
+    UINT32  DataOffset;
+    UINT16  Ds;
+    UINT8   Reserved2[10];
+    UINT8   St0Mm0[10], Reserved3[6];
+    UINT8   St1Mm1[10], Reserved4[6];
+    UINT8   St2Mm2[10], Reserved5[6];
+    UINT8   St3Mm3[10], Reserved6[6];
+    UINT8   St4Mm4[10], Reserved7[6];
+    UINT8   St5Mm5[10], Reserved8[6];
+    UINT8   St6Mm6[10], Reserved9[6];
+    UINT8   St7Mm7[10], Reserved10[6];
+    UINT8   Xmm0[16];
+    UINT8   Xmm1[16];
+    UINT8   Xmm2[16];
+    UINT8   Xmm3[16];
+    UINT8   Xmm4[16];
+    UINT8   Xmm5[16];
+    UINT8   Xmm6[16];
+    UINT8   Xmm7[16];
+    UINT8   Reserved11[14 * 16];
+} EFI_FX_SAVE_STATE_IA32;
+
+typedef struct {
+    UINT32                 ExceptionData;
+    EFI_FX_SAVE_STATE_IA32 FxSaveState;
+    UINT32                 Dr0;
+    UINT32                 Dr1;
+    UINT32                 Dr2;
+    UINT32                 Dr3;
+    UINT32                 Dr6;
+    UINT32                 Dr7;
+    UINT32                 Cr0;
+    UINT32                 Cr1;
+    UINT32                 Cr2;
+    UINT32                 Cr3;
+    UINT32                 Cr4;
+    UINT32                 Eflags;
+    UINT32                 Ldtr;
+    UINT32                 Tr;
+    UINT32                 Gdtr[2];
+    UINT32                 Idtr[2];
+    UINT32                 Eip;
+    UINT32                 Gs;
+    UINT32                 Fs;
+    UINT32                 Es;
+    UINT32                 Ds;
+    UINT32                 Cs;
+    UINT32                 Ss;
+    UINT32                 Edi;
+    UINT32                 Esi;
+    UINT32                 Ebp;
+    UINT32                 Esp;
+    UINT32                 Ebx;
+    UINT32                 Edx;
+    UINT32                 Ecx;
+    UINT32                 Eax;
+} EFI_SYSTEM_CONTEXT_IA32;
+
+// X64
+#define EXCEPT_X64_DIVIDE_ERROR    0
+#define EXCEPT_X64_DEBUG           1
+#define EXCEPT_X64_NMI             2
+#define EXCEPT_X64_BREAKPOINT      3
+#define EXCEPT_X64_OVERFLOW        4
+#define EXCEPT_X64_BOUND           5
+#define EXCEPT_X64_INVALID_OPCODE  6
+#define EXCEPT_X64_DOUBLE_FAULT    8
+#define EXCEPT_X64_INVALID_TSS     10
+#define EXCEPT_X64_SEG_NOT_PRESENT 11
+#define EXCEPT_X64_STACK_FAULT     12
+#define EXCEPT_X64_GP_FAULT        13
+#define EXCEPT_X64_PAGE_FAULT      14
+#define EXCEPT_X64_FP_ERROR        16
+#define EXCEPT_X64_ALIGNMENT_CHECK 17
+#define EXCEPT_X64_MACHINE_CHECK   18
+#define EXCEPT_X64_SIMD            19
+
+typedef struct {
+    UINT16  Fcw;
+    UINT16  Fsw;
+    UINT16  Ftw;
+    UINT16  Opcode;
+    UINT64  Rip;
+    UINT64  DataOffset;
+    UINT8   Reserved1[8];
+    UINT8   St0Mm0[10], Reserved2[6];
+    UINT8   St1Mm1[10], Reserved3[6];
+    UINT8   St2Mm2[10], Reserved4[6];
+    UINT8   St3Mm3[10], Reserved5[6];
+    UINT8   St4Mm4[10], Reserved6[6];
+    UINT8   St5Mm5[10], Reserved7[6];
+    UINT8   St6Mm6[10], Reserved8[6];
+    UINT8   St7Mm7[10], Reserved9[6];
+    UINT8   Xmm0[16];
+    UINT8   Xmm1[16];
+    UINT8   Xmm2[16];
+    UINT8   Xmm3[16];
+    UINT8   Xmm4[16];
+    UINT8   Xmm5[16];
+    UINT8   Xmm6[16];
+    UINT8   Xmm7[16];
+    UINT8   Reserved11[14 * 16];
+} EFI_FX_SAVE_STATE_X64;
+
+typedef struct {
+    UINT64                ExceptionData;
+    EFI_FX_SAVE_STATE_X64 FxSaveState;
+    UINT64                Dr0;
+    UINT64                Dr1;
+    UINT64                Dr2;
+    UINT64                Dr3;
+    UINT64                Dr6;
+    UINT64                Dr7;
+    UINT64                Cr0;
+    UINT64                Cr1;
+    UINT64                Cr2;
+    UINT64                Cr3;
+    UINT64                Cr4;
+    UINT64                Cr8;
+    UINT64                Rflags;
+    UINT64                Ldtr;
+    UINT64                Tr;
+    UINT64                Gdtr[2];
+    UINT64                Idtr[2];
+    UINT64                Rip;
+    UINT64                Gs;
+    UINT64                Fs;
+    UINT64                Es;
+    UINT64                Ds;
+    UINT64                Cs;
+    UINT64                Ss;
+    UINT64                Rdi;
+    UINT64                Rsi;
+    UINT64                Rbp;
+    UINT64                Rsp;
+    UINT64                Rbx;
+    UINT64                Rdx;
+    UINT64                Rcx;
+    UINT64                Rax;
+    UINT64                R8;
+    UINT64                R9;
+    UINT64                R10;
+    UINT64                R11;
+    UINT64                R12;
+    UINT64                R13;
+    UINT64                R14;
+    UINT64                R15;
+} EFI_SYSTEM_CONTEXT_X64;
+
+/// IA64
+#define EXCEPT_IPF_VHTP_TRANSLATION               0
+#define EXCEPT_IPF_INSTRUCTION_TLB                1
+#define EXCEPT_IPF_DATA_TLB                       2
+#define EXCEPT_IPF_ALT_INSTRUCTION_TLB            3
+#define EXCEPT_IPF_ALT_DATA_TLB                   4
+#define EXCEPT_IPF_DATA_NESTED_TLB                5
+#define EXCEPT_IPF_INSTRUCTION_KEY_MISSED         6
+#define EXCEPT_IPF_DATA_KEY_MISSED                7
+#define EXCEPT_IPF_DIRTY_BIT                      8
+#define EXCEPT_IPF_INSTRUCTION_ACCESS_BIT         9
+#define EXCEPT_IPF_DATA_ACCESS_BIT                10
+#define EXCEPT_IPF_BREAKPOINT                     11
+#define EXCEPT_IPF_EXTERNAL_INTERRUPT             12
+#define EXCEPT_IPF_PAGE_NOT_PRESENT               20
+#define EXCEPT_IPF_KEY_PERMISSION                 21
+#define EXCEPT_IPF_INSTRUCTION_ACCESS_RIGHTS      22
+#define EXCEPT_IPF_DATA_ACCESS_RIGHTS             23
+#define EXCEPT_IPF_GENERAL_EXCEPTION              24
+#define EXCEPT_IPF_DISABLED_FP_REGISTER           25
+#define EXCEPT_IPF_NAT_CONSUMPTION                26
+#define EXCEPT_IPF_SPECULATION                    27
+#define EXCEPT_IPF_DEBUG                          29
+#define EXCEPT_IPF_UNALIGNED_REFERENCE            30
+#define EXCEPT_IPF_UNSUPPORTED_DATA_REFERENCE     31
+#define EXCEPT_IPF_FP_FAULT                       32
+#define EXCEPT_IPF_FP_TRAP                        33
+#define EXCEPT_IPF_LOWER_PRIVILEGE_TRANSFER_TRAP  34
+#define EXCEPT_IPF_TAKEN_BRANCH                   35
+#define EXCEPT_IPF_SINGLE_STEP                    36
+#define EXCEPT_IPF_IA32_EXCEPTION                 45
+#define EXCEPT_IPF_IA32_INTERCEPT                 46
+#define EXCEPT_IPF_IA32_INTERRUPT                 47
+
+typedef struct {
+    UINT64  Reserved;
+    UINT64  R1;
+    UINT64  R2;
+    UINT64  R3;
+    UINT64  R4;
+    UINT64  R5;
+    UINT64  R6;
+    UINT64  R7;
+    UINT64  R8;
+    UINT64  R9;
+    UINT64  R10;
+    UINT64  R11;
+    UINT64  R12;
+    UINT64  R13;
+    UINT64  R14;
+    UINT64  R15;
+    UINT64  R16;
+    UINT64  R17;
+    UINT64  R18;
+    UINT64  R19;
+    UINT64  R20;
+    UINT64  R21;
+    UINT64  R22;
+    UINT64  R23;
+    UINT64  R24;
+    UINT64  R25;
+    UINT64  R26;
+    UINT64  R27;
+    UINT64  R28;
+    UINT64  R29;
+    UINT64  R30;
+    UINT64  R31;
+    UINT64  F2[2];
+    UINT64  F3[2];
+    UINT64  F4[2];
+    UINT64  F5[2];
+    UINT64  F6[2];
+    UINT64  F7[2];
+    UINT64  F8[2];
+    UINT64  F9[2];
+    UINT64  F10[2];
+    UINT64  F11[2];
+    UINT64  F12[2];
+    UINT64  F13[2];
+    UINT64  F14[2];
+    UINT64  F15[2];
+    UINT64  F16[2];
+    UINT64  F17[2];
+    UINT64  F18[2];
+    UINT64  F19[2];
+    UINT64  F20[2];
+    UINT64  F21[2];
+    UINT64  F22[2];
+    UINT64  F23[2];
+    UINT64  F24[2];
+    UINT64  F25[2];
+    UINT64  F26[2];
+    UINT64  F27[2];
+    UINT64  F28[2];
+    UINT64  F29[2];
+    UINT64  F30[2];
+    UINT64  F31[2];
+    UINT64  Pr;
+    UINT64  B0;
+    UINT64  B1;
+    UINT64  B2;
+    UINT64  B3;
+    UINT64  B4;
+    UINT64  B5;
+    UINT64  B6;
+    UINT64  B7;
+    UINT64  ArRsc;
+    UINT64  ArBsp;
+    UINT64  ArBspstore;
+    UINT64  ArRnat;
+    UINT64  ArFcr;
+    UINT64  ArEflag;
+    UINT64  ArCsd;
+    UINT64  ArSsd;
+    UINT64  ArCflg;
+    UINT64  ArFsr;
+    UINT64  ArFir;
+    UINT64  ArFdr;
+    UINT64  ArCcv;
+    UINT64  ArUnat;
+    UINT64  ArFpsr;
+    UINT64  ArPfs;
+    UINT64  ArLc;
+    UINT64  ArEc;
+    UINT64  CrDcr;
+    UINT64  CrItm;
+    UINT64  CrIva;
+    UINT64  CrPta;
+    UINT64  CrIpsr;
+    UINT64  CrIsr;
+    UINT64  CrIip;
+    UINT64  CrIfa;
+    UINT64  CrItir;
+    UINT64  CrIipa;
+    UINT64  CrIfs;
+    UINT64  CrIim;
+    UINT64  CrIha;
+    UINT64  Dbr0;
+    UINT64  Dbr1;
+    UINT64  Dbr2;
+    UINT64  Dbr3;
+    UINT64  Dbr4;
+    UINT64  Dbr5;
+    UINT64  Dbr6;
+    UINT64  Dbr7;
+    UINT64  Ibr0;
+    UINT64  Ibr1;
+    UINT64  Ibr2;
+    UINT64  Ibr3;
+    UINT64  Ibr4;
+    UINT64  Ibr5;
+    UINT64  Ibr6;
+    UINT64  Ibr7;
+    UINT64  IntNat;
+} EFI_SYSTEM_CONTEXT_IPF;
+
+// EBC
+#define EXCEPT_EBC_UNDEFINED            0
+#define EXCEPT_EBC_DIVIDE_ERROR         1
+#define EXCEPT_EBC_DEBUG                2
+#define EXCEPT_EBC_BREAKPOINT           3
+#define EXCEPT_EBC_OVERFLOW             4
+#define EXCEPT_EBC_INVALID_OPCODE       5
+#define EXCEPT_EBC_STACK_FAULT          6
+#define EXCEPT_EBC_ALIGNMENT_CHECK      7
+#define EXCEPT_EBC_INSTRUCTION_ENCODING 8
+#define EXCEPT_EBC_BAD_BREAK            9
+#define EXCEPT_EBC_STEP                 10
+#define MAX_EBC_EXCEPTION               EXCEPT_EBC_STEP
+
+typedef struct {
+    UINT64  R0;
+    UINT64  R1;
+    UINT64  R2;
+    UINT64  R3;
+    UINT64  R4;
+    UINT64  R5;
+    UINT64  R6;
+    UINT64  R7;
+    UINT64  Flags;
+    UINT64  ControlFlags;
+    UINT64  Ip;
+} EFI_SYSTEM_CONTEXT_EBC;
+
+// ARM
+#define EXCEPT_ARM_RESET                    0
+#define EXCEPT_ARM_UNDEFINED_INSTRUCTION    1
+#define EXCEPT_ARM_SOFTWARE_INTERRUPT       2
+#define EXCEPT_ARM_PREFETCH_ABORT           3
+#define EXCEPT_ARM_DATA_ABORT               4
+#define EXCEPT_ARM_RESERVED                 5
+#define EXCEPT_ARM_IRQ                      6
+#define EXCEPT_ARM_FIQ                      7
+#define MAX_ARM_EXCEPTION                   EXCEPT_ARM_FIQ
+
+typedef struct {
+    UINT32  R0;
+    UINT32  R1;
+    UINT32  R2;
+    UINT32  R3;
+    UINT32  R4;
+    UINT32  R5;
+    UINT32  R6;
+    UINT32  R7;
+    UINT32  R8;
+    UINT32  R9;
+    UINT32  R10;
+    UINT32  R11;
+    UINT32  R12;
+    UINT32  SP;
+    UINT32  LR;
+    UINT32  PC;
+    UINT32  CPSR;
+    UINT32  DFSR;
+    UINT32  DFAR;
+    UINT32  IFSR;
+    UINT32  IFAR;
+} EFI_SYSTEM_CONTEXT_ARM;
+
+
+typedef union {
+    EFI_SYSTEM_CONTEXT_EBC  *SystemContextEbc;
+    EFI_SYSTEM_CONTEXT_IA32 *SystemContextIa32;
+    EFI_SYSTEM_CONTEXT_X64  *SystemContextX64;
+    EFI_SYSTEM_CONTEXT_IPF  *SystemContextIpf;
+    EFI_SYSTEM_CONTEXT_ARM  *SystemContextArm;
+} EFI_SYSTEM_CONTEXT;
+
+typedef
+VOID
+(EFIAPI *EFI_EXCEPTION_CALLBACK)(
+    IN     EFI_EXCEPTION_TYPE               ExceptionType,
+    IN OUT EFI_SYSTEM_CONTEXT               SystemContext);
+
+typedef
+VOID
+(EFIAPI *EFI_PERIODIC_CALLBACK)(
+    IN OUT EFI_SYSTEM_CONTEXT               SystemContext);
+
+typedef enum {
+    IsaIa32 = EFI_IMAGE_MACHINE_IA32,
+    IsaX64 = EFI_IMAGE_MACHINE_X64,
+    IsaIpf = EFI_IMAGE_MACHINE_IA64,
+    IsaEbc = EFI_IMAGE_MACHINE_EBC,
+    IsaArm = EFI_IMAGE_MACHINE_ARMTHUMB_MIXED,
+//	IsaArm64 = EFI_IMAGE_MACHINE_AARCH64
+} EFI_INSTRUCTION_SET_ARCHITECTURE;
+
+//
+// DEBUG_IMAGE_INFO
+//
 
+#define EFI_DEBUG_IMAGE_INFO_TABLE_GUID \
+    { 0x49152e77, 0x1ada, 0x4764, {0xb7, 0xa2, 0x7a, 0xfe, 0xfe, 0xd9, 0x5e, 0x8b} }
+
+#define EFI_DEBUG_IMAGE_INFO_UPDATE_IN_PROGRESS 0x01
+#define EFI_DEBUG_IMAGE_INFO_TABLE_MODIFIED     0x02
+#define EFI_DEBUG_IMAGE_INFO_INITIAL_SIZE       (EFI_PAGE_SIZE / sizeof (UINTN))
+#define EFI_DEBUG_IMAGE_INFO_TYPE_NORMAL        0x01
+
+typedef struct {
+UINT64                Signature;
+EFI_PHYSICAL_ADDRESS  EfiSystemTableBase;
+UINT32                Crc32;
+} EFI_SYSTEM_TABLE_POINTER;
+
+typedef struct {
+UINT32                    ImageInfoType;
+EFI_LOADED_IMAGE_PROTOCOL *LoadedImageProtocolInstance;
+EFI_HANDLE                *ImageHandle;
+} EFI_DEBUG_IMAGE_INFO_NORMAL;
+
+typedef union {
+UINT32                      *ImageInfoType;
+EFI_DEBUG_IMAGE_INFO_NORMAL *NormalImage;
+} EFI_DEBUG_IMAGE_INFO;
+
+typedef struct {
+volatile UINT32       UpdateStatus;
+UINT32                TableSize;
+EFI_DEBUG_IMAGE_INFO  *EfiDebugImageInfoTable;
+} EFI_DEBUG_IMAGE_INFO_TABLE_HEADER;
+
+//
+// EFI_DEBUGGER_PROTOCOL
+//
+
+#define EFI_DEBUG_SUPPORT_PROTOCOL_GUID \
+    { 0x2755590c, 0x6f3c, 0x42fa, {0x9e, 0xa4, 0xa3, 0xba, 0x54, 0x3c, 0xda, 0x25} }
+
+INTERFACE_DECL(_EFI_DEBUG_SUPPORT_PROTOCOL);
+
+typedef
+EFI_STATUS
+(EFIAPI *EFI_GET_MAXIMUM_PROCESSOR_INDEX)(
+    IN struct _EFI_DEBUG_SUPPORT_PROTOCOL  *This,
+    OUT UINTN                              *MaxProcessorIndex);
+
+typedef
+EFI_STATUS
+(EFIAPI *EFI_REGISTER_PERIODIC_CALLBACK)(
+    IN struct _EFI_DEBUG_SUPPORT_PROTOCOL  *This,
+    IN UINTN                               ProcessorIndex,
+    IN EFI_PERIODIC_CALLBACK               PeriodicCallback);
+
+typedef
+EFI_STATUS
+(EFIAPI *EFI_REGISTER_EXCEPTION_CALLBACK)(
+    IN struct _EFI_DEBUG_SUPPORT_PROTOCOL  *This,
+    IN UINTN                               ProcessorIndex,
+    IN EFI_EXCEPTION_CALLBACK              ExceptionCallback,
+    IN EFI_EXCEPTION_TYPE                  ExceptionType);
+
+typedef
+EFI_STATUS
+(EFIAPI *EFI_INVALIDATE_INSTRUCTION_CACHE)(
+    IN struct _EFI_DEBUG_SUPPORT_PROTOCOL  *This,
+    IN UINTN                               ProcessorIndex,
+    IN VOID                                *Start,
+    IN UINT64                              Length);
+
+typedef struct _EFI_DEBUG_SUPPORT_PROTOCOL {
+    EFI_INSTRUCTION_SET_ARCHITECTURE  Isa;
+    EFI_GET_MAXIMUM_PROCESSOR_INDEX   GetMaximumProcessorIndex;
+    EFI_REGISTER_PERIODIC_CALLBACK    RegisterPeriodicCallback;
+    EFI_REGISTER_EXCEPTION_CALLBACK   RegisterExceptionCallback;
+    EFI_INVALIDATE_INSTRUCTION_CACHE  InvalidateInstructionCache;
+} EFI_DEBUG_SUPPORT_PROTOCOL;
+
+#endif

+ 3 - 0
inc/efilib.h

@@ -142,6 +142,9 @@ extern EFI_GUID SalSystemTableGuid;
 extern EFI_GUID SimplePointerProtocol;
 extern EFI_GUID AbsolutePointerProtocol;
 
+extern EFI_GUID gEfiDebugImageInfoTableGuid;
+extern EFI_GUID gEfiDebugSupportProtocolGuid;
+
 //
 // EFI Variable strings
 //

+ 5 - 0
lib/data.c

@@ -191,3 +191,8 @@ EFI_GUID Tcp4Protocol = EFI_TCP4_PROTOCOL;
 EFI_GUID SimplePointerProtocol    = EFI_SIMPLE_POINTER_PROTOCOL_GUID;
 EFI_GUID AbsolutePointerProtocol  = EFI_ABSOLUTE_POINTER_PROTOCOL_GUID;
 
+//
+// Debugger protocol GUIDs
+//
+EFI_GUID gEfiDebugImageInfoTableGuid           = EFI_DEBUG_IMAGE_INFO_TABLE_GUID;
+EFI_GUID gEfiDebugSupportProtocolGuid          = EFI_DEBUG_SUPPORT_PROTOCOL_GUID;