2 DebugSupport protocol and supporting definitions as defined in the UEFI2.4
5 The DebugSupport protocol is used by source level debuggers to abstract the
6 processor and handle context save and restore operations.
8 Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
9 Portions copyright (c) 2011 - 2013, ARM Ltd. All rights reserved.<BR>
11 This program and the accompanying materials are licensed and made available under
12 the terms and conditions of the BSD License that accompanies this distribution.
13 The full text of the license may be found at
14 http://opensource.org/licenses/bsd-license.php.
16 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
17 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
21 #ifndef __DEBUG_SUPPORT_H__
22 #define __DEBUG_SUPPORT_H__
24 #include <IndustryStandard/PeImage.h>
26 typedef struct _EFI_DEBUG_SUPPORT_PROTOCOL EFI_DEBUG_SUPPORT_PROTOCOL
;
29 /// Debug Support protocol {2755590C-6F3C-42FA-9EA4-A3BA543CDA25}.
31 #define EFI_DEBUG_SUPPORT_PROTOCOL_GUID \
33 0x2755590C, 0x6F3C, 0x42FA, {0x9E, 0xA4, 0xA3, 0xBA, 0x54, 0x3C, 0xDA, 0x25 } \
37 /// Processor exception to be hooked.
38 /// All exception types for IA32, X64, Itanium and EBC processors are defined.
40 typedef INTN EFI_EXCEPTION_TYPE
;
43 /// IA-32 processor exception types.
45 #define EXCEPT_IA32_DIVIDE_ERROR 0
46 #define EXCEPT_IA32_DEBUG 1
47 #define EXCEPT_IA32_NMI 2
48 #define EXCEPT_IA32_BREAKPOINT 3
49 #define EXCEPT_IA32_OVERFLOW 4
50 #define EXCEPT_IA32_BOUND 5
51 #define EXCEPT_IA32_INVALID_OPCODE 6
52 #define EXCEPT_IA32_DOUBLE_FAULT 8
53 #define EXCEPT_IA32_INVALID_TSS 10
54 #define EXCEPT_IA32_SEG_NOT_PRESENT 11
55 #define EXCEPT_IA32_STACK_FAULT 12
56 #define EXCEPT_IA32_GP_FAULT 13
57 #define EXCEPT_IA32_PAGE_FAULT 14
58 #define EXCEPT_IA32_FP_ERROR 16
59 #define EXCEPT_IA32_ALIGNMENT_CHECK 17
60 #define EXCEPT_IA32_MACHINE_CHECK 18
61 #define EXCEPT_IA32_SIMD 19
65 /// FP / MMX / XMM registers (see fxrstor instruction definition).
78 UINT8 St0Mm0
[10], Reserved3
[6];
79 UINT8 St1Mm1
[10], Reserved4
[6];
80 UINT8 St2Mm2
[10], Reserved5
[6];
81 UINT8 St3Mm3
[10], Reserved6
[6];
82 UINT8 St4Mm4
[10], Reserved7
[6];
83 UINT8 St5Mm5
[10], Reserved8
[6];
84 UINT8 St6Mm6
[10], Reserved9
[6];
85 UINT8 St7Mm7
[10], Reserved10
[6];
94 UINT8 Reserved11
[14 * 16];
95 } EFI_FX_SAVE_STATE_IA32
;
98 /// IA-32 processor context definition.
101 UINT32 ExceptionData
;
102 EFI_FX_SAVE_STATE_IA32 FxSaveState
;
110 UINT32 Cr1
; /* Reserved */
134 } EFI_SYSTEM_CONTEXT_IA32
;
137 /// x64 processor exception types.
139 #define EXCEPT_X64_DIVIDE_ERROR 0
140 #define EXCEPT_X64_DEBUG 1
141 #define EXCEPT_X64_NMI 2
142 #define EXCEPT_X64_BREAKPOINT 3
143 #define EXCEPT_X64_OVERFLOW 4
144 #define EXCEPT_X64_BOUND 5
145 #define EXCEPT_X64_INVALID_OPCODE 6
146 #define EXCEPT_X64_DOUBLE_FAULT 8
147 #define EXCEPT_X64_INVALID_TSS 10
148 #define EXCEPT_X64_SEG_NOT_PRESENT 11
149 #define EXCEPT_X64_STACK_FAULT 12
150 #define EXCEPT_X64_GP_FAULT 13
151 #define EXCEPT_X64_PAGE_FAULT 14
152 #define EXCEPT_X64_FP_ERROR 16
153 #define EXCEPT_X64_ALIGNMENT_CHECK 17
154 #define EXCEPT_X64_MACHINE_CHECK 18
155 #define EXCEPT_X64_SIMD 19
159 /// FP / MMX / XMM registers (see fxrstor instruction definition).
169 UINT8 St0Mm0
[10], Reserved2
[6];
170 UINT8 St1Mm1
[10], Reserved3
[6];
171 UINT8 St2Mm2
[10], Reserved4
[6];
172 UINT8 St3Mm3
[10], Reserved5
[6];
173 UINT8 St4Mm4
[10], Reserved6
[6];
174 UINT8 St5Mm5
[10], Reserved7
[6];
175 UINT8 St6Mm6
[10], Reserved8
[6];
176 UINT8 St7Mm7
[10], Reserved9
[6];
186 // NOTE: UEFI 2.0 spec definition as follows.
188 UINT8 Reserved11
[14 * 16];
189 } EFI_FX_SAVE_STATE_X64
;
192 /// x64 processor context definition.
195 UINT64 ExceptionData
;
196 EFI_FX_SAVE_STATE_X64 FxSaveState
;
204 UINT64 Cr1
; /* Reserved */
237 } EFI_SYSTEM_CONTEXT_X64
;
240 /// Itanium Processor Family Exception types.
242 #define EXCEPT_IPF_VHTP_TRANSLATION 0
243 #define EXCEPT_IPF_INSTRUCTION_TLB 1
244 #define EXCEPT_IPF_DATA_TLB 2
245 #define EXCEPT_IPF_ALT_INSTRUCTION_TLB 3
246 #define EXCEPT_IPF_ALT_DATA_TLB 4
247 #define EXCEPT_IPF_DATA_NESTED_TLB 5
248 #define EXCEPT_IPF_INSTRUCTION_KEY_MISSED 6
249 #define EXCEPT_IPF_DATA_KEY_MISSED 7
250 #define EXCEPT_IPF_DIRTY_BIT 8
251 #define EXCEPT_IPF_INSTRUCTION_ACCESS_BIT 9
252 #define EXCEPT_IPF_DATA_ACCESS_BIT 10
253 #define EXCEPT_IPF_BREAKPOINT 11
254 #define EXCEPT_IPF_EXTERNAL_INTERRUPT 12
258 #define EXCEPT_IPF_PAGE_NOT_PRESENT 20
259 #define EXCEPT_IPF_KEY_PERMISSION 21
260 #define EXCEPT_IPF_INSTRUCTION_ACCESS_RIGHTS 22
261 #define EXCEPT_IPF_DATA_ACCESS_RIGHTS 23
262 #define EXCEPT_IPF_GENERAL_EXCEPTION 24
263 #define EXCEPT_IPF_DISABLED_FP_REGISTER 25
264 #define EXCEPT_IPF_NAT_CONSUMPTION 26
265 #define EXCEPT_IPF_SPECULATION 27
269 #define EXCEPT_IPF_DEBUG 29
270 #define EXCEPT_IPF_UNALIGNED_REFERENCE 30
271 #define EXCEPT_IPF_UNSUPPORTED_DATA_REFERENCE 31
272 #define EXCEPT_IPF_FP_FAULT 32
273 #define EXCEPT_IPF_FP_TRAP 33
274 #define EXCEPT_IPF_LOWER_PRIVILEGE_TRANSFER_TRAP 34
275 #define EXCEPT_IPF_TAKEN_BRANCH 35
276 #define EXCEPT_IPF_SINGLE_STEP 36
280 #define EXCEPT_IPF_IA32_EXCEPTION 45
281 #define EXCEPT_IPF_IA32_INTERCEPT 46
282 #define EXCEPT_IPF_IA32_INTERRUPT 47
285 /// IPF processor context definition.
289 // The first reserved field is necessary to preserve alignment for the correct
290 // bits in UNAT and to insure F2 is 16 byte aligned.
368 // application registers
434 // virtual registers - nat bits for R1-R31
438 } EFI_SYSTEM_CONTEXT_IPF
;
441 /// EBC processor exception types.
443 #define EXCEPT_EBC_UNDEFINED 0
444 #define EXCEPT_EBC_DIVIDE_ERROR 1
445 #define EXCEPT_EBC_DEBUG 2
446 #define EXCEPT_EBC_BREAKPOINT 3
447 #define EXCEPT_EBC_OVERFLOW 4
448 #define EXCEPT_EBC_INVALID_OPCODE 5 ///< Opcode out of range.
449 #define EXCEPT_EBC_STACK_FAULT 6
450 #define EXCEPT_EBC_ALIGNMENT_CHECK 7
451 #define EXCEPT_EBC_INSTRUCTION_ENCODING 8 ///< Malformed instruction.
452 #define EXCEPT_EBC_BAD_BREAK 9 ///< BREAK 0 or undefined BREAK.
453 #define EXCEPT_EBC_STEP 10 ///< To support debug stepping.
455 /// For coding convenience, define the maximum valid EBC exception.
457 #define MAX_EBC_EXCEPTION EXCEPT_EBC_STEP
460 /// EBC processor context definition.
474 } EFI_SYSTEM_CONTEXT_EBC
;
479 /// ARM processor exception types.
481 #define EXCEPT_ARM_RESET 0
482 #define EXCEPT_ARM_UNDEFINED_INSTRUCTION 1
483 #define EXCEPT_ARM_SOFTWARE_INTERRUPT 2
484 #define EXCEPT_ARM_PREFETCH_ABORT 3
485 #define EXCEPT_ARM_DATA_ABORT 4
486 #define EXCEPT_ARM_RESERVED 5
487 #define EXCEPT_ARM_IRQ 6
488 #define EXCEPT_ARM_FIQ 7
491 /// For coding convenience, define the maximum valid ARM exception.
493 #define MAX_ARM_EXCEPTION EXCEPT_ARM_FIQ
496 /// ARM processor context definition.
520 } EFI_SYSTEM_CONTEXT_ARM
;
524 /// AARCH64 processor exception types.
526 #define EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS 0
527 #define EXCEPT_AARCH64_IRQ 1
528 #define EXCEPT_AARCH64_FIQ 2
529 #define EXCEPT_AARCH64_SERROR 3
532 /// For coding convenience, define the maximum valid ARM exception.
534 #define MAX_AARCH64_EXCEPTION EXCEPT_AARCH64_SERROR
537 // General Purpose Registers
567 UINT64 FP
; // x29 - Frame pointer
568 UINT64 LR
; // x30 - Link Register
569 UINT64 SP
; // x31 - Stack pointer
605 UINT64 ELR
; // Exception Link Register
606 UINT64 SPSR
; // Saved Processor Status Register
607 UINT64 FPSR
; // Floating Point Status Register
608 UINT64 ESR
; // Exception syndrome register
609 UINT64 FAR
; // Fault Address Register
610 } EFI_SYSTEM_CONTEXT_AARCH64
;
614 /// Universal EFI_SYSTEM_CONTEXT definition.
617 EFI_SYSTEM_CONTEXT_EBC
*SystemContextEbc
;
618 EFI_SYSTEM_CONTEXT_IA32
*SystemContextIa32
;
619 EFI_SYSTEM_CONTEXT_X64
*SystemContextX64
;
620 EFI_SYSTEM_CONTEXT_IPF
*SystemContextIpf
;
621 EFI_SYSTEM_CONTEXT_ARM
*SystemContextArm
;
622 EFI_SYSTEM_CONTEXT_AARCH64
*SystemContextAArch64
;
623 } EFI_SYSTEM_CONTEXT
;
626 // DebugSupport callback function prototypes
630 Registers and enables an exception callback function for the specified exception.
632 @param ExceptionType Exception types in EBC, IA-32, x64, or IPF.
633 @param SystemContext Exception content.
638 (EFIAPI
*EFI_EXCEPTION_CALLBACK
)(
639 IN EFI_EXCEPTION_TYPE ExceptionType
,
640 IN OUT EFI_SYSTEM_CONTEXT SystemContext
644 Registers and enables the on-target debug agent's periodic entry point.
646 @param SystemContext Exception content.
651 (EFIAPI
*EFI_PERIODIC_CALLBACK
)(
652 IN OUT EFI_SYSTEM_CONTEXT SystemContext
656 /// Machine type definition
659 IsaIa32
= IMAGE_FILE_MACHINE_I386
, ///< 0x014C
660 IsaX64
= IMAGE_FILE_MACHINE_X64
, ///< 0x8664
661 IsaIpf
= IMAGE_FILE_MACHINE_IA64
, ///< 0x0200
662 IsaEbc
= IMAGE_FILE_MACHINE_EBC
, ///< 0x0EBC
663 IsaArm
= IMAGE_FILE_MACHINE_ARMTHUMB_MIXED
, ///< 0x01c2
664 IsaAArch64
= IMAGE_FILE_MACHINE_ARM64
///< 0xAA64
665 } EFI_INSTRUCTION_SET_ARCHITECTURE
;
669 // DebugSupport member function definitions
673 Returns the maximum value that may be used for the ProcessorIndex parameter in
674 RegisterPeriodicCallback() and RegisterExceptionCallback().
676 @param This A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.
677 @param MaxProcessorIndex Pointer to a caller-allocated UINTN in which the maximum supported
678 processor index is returned.
680 @retval EFI_SUCCESS The function completed successfully.
685 (EFIAPI
*EFI_GET_MAXIMUM_PROCESSOR_INDEX
)(
686 IN EFI_DEBUG_SUPPORT_PROTOCOL
*This
,
687 OUT UINTN
*MaxProcessorIndex
691 Registers a function to be called back periodically in interrupt context.
693 @param This A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.
694 @param ProcessorIndex Specifies which processor the callback function applies to.
695 @param PeriodicCallback A pointer to a function of type PERIODIC_CALLBACK that is the main
696 periodic entry point of the debug agent.
698 @retval EFI_SUCCESS The function completed successfully.
699 @retval EFI_ALREADY_STARTED Non-NULL PeriodicCallback parameter when a callback
700 function was previously registered.
701 @retval EFI_OUT_OF_RESOURCES System has insufficient memory resources to register new callback
707 (EFIAPI
*EFI_REGISTER_PERIODIC_CALLBACK
)(
708 IN EFI_DEBUG_SUPPORT_PROTOCOL
*This
,
709 IN UINTN ProcessorIndex
,
710 IN EFI_PERIODIC_CALLBACK PeriodicCallback
714 Registers a function to be called when a given processor exception occurs.
716 @param This A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.
717 @param ProcessorIndex Specifies which processor the callback function applies to.
718 @param ExceptionCallback A pointer to a function of type EXCEPTION_CALLBACK that is called
719 when the processor exception specified by ExceptionType occurs.
720 @param ExceptionType Specifies which processor exception to hook.
722 @retval EFI_SUCCESS The function completed successfully.
723 @retval EFI_ALREADY_STARTED Non-NULL PeriodicCallback parameter when a callback
724 function was previously registered.
725 @retval EFI_OUT_OF_RESOURCES System has insufficient memory resources to register new callback
731 (EFIAPI
*EFI_REGISTER_EXCEPTION_CALLBACK
)(
732 IN EFI_DEBUG_SUPPORT_PROTOCOL
*This
,
733 IN UINTN ProcessorIndex
,
734 IN EFI_EXCEPTION_CALLBACK ExceptionCallback
,
735 IN EFI_EXCEPTION_TYPE ExceptionType
739 Invalidates processor instruction cache for a memory range. Subsequent execution in this range
740 causes a fresh memory fetch to retrieve code to be executed.
742 @param This A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.
743 @param ProcessorIndex Specifies which processor's instruction cache is to be invalidated.
744 @param Start Specifies the physical base of the memory range to be invalidated.
745 @param Length Specifies the minimum number of bytes in the processor's instruction
748 @retval EFI_SUCCESS The function completed successfully.
753 (EFIAPI
*EFI_INVALIDATE_INSTRUCTION_CACHE
)(
754 IN EFI_DEBUG_SUPPORT_PROTOCOL
*This
,
755 IN UINTN ProcessorIndex
,
761 /// This protocol provides the services to allow the debug agent to register
762 /// callback functions that are called either periodically or when specific
763 /// processor exceptions occur.
765 struct _EFI_DEBUG_SUPPORT_PROTOCOL
{
767 /// Declares the processor architecture for this instance of the EFI Debug Support protocol.
769 EFI_INSTRUCTION_SET_ARCHITECTURE Isa
;
770 EFI_GET_MAXIMUM_PROCESSOR_INDEX GetMaximumProcessorIndex
;
771 EFI_REGISTER_PERIODIC_CALLBACK RegisterPeriodicCallback
;
772 EFI_REGISTER_EXCEPTION_CALLBACK RegisterExceptionCallback
;
773 EFI_INVALIDATE_INSTRUCTION_CACHE InvalidateInstructionCache
;
776 extern EFI_GUID gEfiDebugSupportProtocolGuid
;