1*f334afcfSToomas Soome /** @file
2*f334afcfSToomas Soome   DebugSupport protocol and supporting definitions as defined in the UEFI2.4
3*f334afcfSToomas Soome   specification.
4*f334afcfSToomas Soome 
5*f334afcfSToomas Soome   The DebugSupport protocol is used by source level debuggers to abstract the
6*f334afcfSToomas Soome   processor and handle context save and restore operations.
7*f334afcfSToomas Soome 
8*f334afcfSToomas Soome Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
9*f334afcfSToomas Soome Portions copyright (c) 2011 - 2013, ARM Ltd. All rights reserved.<BR>
10*f334afcfSToomas Soome Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>
11*f334afcfSToomas Soome 
12*f334afcfSToomas Soome SPDX-License-Identifier: BSD-2-Clause-Patent
13*f334afcfSToomas Soome 
14*f334afcfSToomas Soome **/
15*f334afcfSToomas Soome 
16*f334afcfSToomas Soome #ifndef __DEBUG_SUPPORT_H__
17*f334afcfSToomas Soome #define __DEBUG_SUPPORT_H__
18*f334afcfSToomas Soome 
19*f334afcfSToomas Soome #include <IndustryStandard/PeImage.h>
20*f334afcfSToomas Soome 
21*f334afcfSToomas Soome typedef struct _EFI_DEBUG_SUPPORT_PROTOCOL EFI_DEBUG_SUPPORT_PROTOCOL;
22*f334afcfSToomas Soome 
23*f334afcfSToomas Soome ///
24*f334afcfSToomas Soome /// Debug Support protocol {2755590C-6F3C-42FA-9EA4-A3BA543CDA25}.
25*f334afcfSToomas Soome ///
26*f334afcfSToomas Soome #define EFI_DEBUG_SUPPORT_PROTOCOL_GUID \
27*f334afcfSToomas Soome   { \
28*f334afcfSToomas Soome     0x2755590C, 0x6F3C, 0x42FA, {0x9E, 0xA4, 0xA3, 0xBA, 0x54, 0x3C, 0xDA, 0x25 } \
29*f334afcfSToomas Soome   }
30*f334afcfSToomas Soome 
31*f334afcfSToomas Soome ///
32*f334afcfSToomas Soome /// Processor exception to be hooked.
33*f334afcfSToomas Soome /// All exception types for IA32, X64, Itanium and EBC processors are defined.
34*f334afcfSToomas Soome ///
35*f334afcfSToomas Soome typedef INTN EFI_EXCEPTION_TYPE;
36*f334afcfSToomas Soome 
37*f334afcfSToomas Soome ///
38*f334afcfSToomas Soome ///  IA-32 processor exception types.
39*f334afcfSToomas Soome ///
40*f334afcfSToomas Soome #define EXCEPT_IA32_DIVIDE_ERROR     0
41*f334afcfSToomas Soome #define EXCEPT_IA32_DEBUG            1
42*f334afcfSToomas Soome #define EXCEPT_IA32_NMI              2
43*f334afcfSToomas Soome #define EXCEPT_IA32_BREAKPOINT       3
44*f334afcfSToomas Soome #define EXCEPT_IA32_OVERFLOW         4
45*f334afcfSToomas Soome #define EXCEPT_IA32_BOUND            5
46*f334afcfSToomas Soome #define EXCEPT_IA32_INVALID_OPCODE   6
47*f334afcfSToomas Soome #define EXCEPT_IA32_DOUBLE_FAULT     8
48*f334afcfSToomas Soome #define EXCEPT_IA32_INVALID_TSS      10
49*f334afcfSToomas Soome #define EXCEPT_IA32_SEG_NOT_PRESENT  11
50*f334afcfSToomas Soome #define EXCEPT_IA32_STACK_FAULT      12
51*f334afcfSToomas Soome #define EXCEPT_IA32_GP_FAULT         13
52*f334afcfSToomas Soome #define EXCEPT_IA32_PAGE_FAULT       14
53*f334afcfSToomas Soome #define EXCEPT_IA32_FP_ERROR         16
54*f334afcfSToomas Soome #define EXCEPT_IA32_ALIGNMENT_CHECK  17
55*f334afcfSToomas Soome #define EXCEPT_IA32_MACHINE_CHECK    18
56*f334afcfSToomas Soome #define EXCEPT_IA32_SIMD             19
57*f334afcfSToomas Soome 
58*f334afcfSToomas Soome ///
59*f334afcfSToomas Soome /// FXSAVE_STATE.
60*f334afcfSToomas Soome /// FP / MMX / XMM registers (see fxrstor instruction definition).
61*f334afcfSToomas Soome ///
62*f334afcfSToomas Soome typedef struct {
63*f334afcfSToomas Soome   UINT16    Fcw;
64*f334afcfSToomas Soome   UINT16    Fsw;
65*f334afcfSToomas Soome   UINT16    Ftw;
66*f334afcfSToomas Soome   UINT16    Opcode;
67*f334afcfSToomas Soome   UINT32    Eip;
68*f334afcfSToomas Soome   UINT16    Cs;
69*f334afcfSToomas Soome   UINT16    Reserved1;
70*f334afcfSToomas Soome   UINT32    DataOffset;
71*f334afcfSToomas Soome   UINT16    Ds;
72*f334afcfSToomas Soome   UINT8     Reserved2[10];
73*f334afcfSToomas Soome   UINT8     St0Mm0[10], Reserved3[6];
74*f334afcfSToomas Soome   UINT8     St1Mm1[10], Reserved4[6];
75*f334afcfSToomas Soome   UINT8     St2Mm2[10], Reserved5[6];
76*f334afcfSToomas Soome   UINT8     St3Mm3[10], Reserved6[6];
77*f334afcfSToomas Soome   UINT8     St4Mm4[10], Reserved7[6];
78*f334afcfSToomas Soome   UINT8     St5Mm5[10], Reserved8[6];
79*f334afcfSToomas Soome   UINT8     St6Mm6[10], Reserved9[6];
80*f334afcfSToomas Soome   UINT8     St7Mm7[10], Reserved10[6];
81*f334afcfSToomas Soome   UINT8     Xmm0[16];
82*f334afcfSToomas Soome   UINT8     Xmm1[16];
83*f334afcfSToomas Soome   UINT8     Xmm2[16];
84*f334afcfSToomas Soome   UINT8     Xmm3[16];
85*f334afcfSToomas Soome   UINT8     Xmm4[16];
86*f334afcfSToomas Soome   UINT8     Xmm5[16];
87*f334afcfSToomas Soome   UINT8     Xmm6[16];
88*f334afcfSToomas Soome   UINT8     Xmm7[16];
89*f334afcfSToomas Soome   UINT8     Reserved11[14 * 16];
90*f334afcfSToomas Soome } EFI_FX_SAVE_STATE_IA32;
91*f334afcfSToomas Soome 
92*f334afcfSToomas Soome ///
93*f334afcfSToomas Soome ///  IA-32 processor context definition.
94*f334afcfSToomas Soome ///
95*f334afcfSToomas Soome typedef struct {
96*f334afcfSToomas Soome   UINT32                    ExceptionData;
97*f334afcfSToomas Soome   EFI_FX_SAVE_STATE_IA32    FxSaveState;
98*f334afcfSToomas Soome   UINT32                    Dr0;
99*f334afcfSToomas Soome   UINT32                    Dr1;
100*f334afcfSToomas Soome   UINT32                    Dr2;
101*f334afcfSToomas Soome   UINT32                    Dr3;
102*f334afcfSToomas Soome   UINT32                    Dr6;
103*f334afcfSToomas Soome   UINT32                    Dr7;
104*f334afcfSToomas Soome   UINT32                    Cr0;
105*f334afcfSToomas Soome   UINT32                    Cr1; /* Reserved */
106*f334afcfSToomas Soome   UINT32                    Cr2;
107*f334afcfSToomas Soome   UINT32                    Cr3;
108*f334afcfSToomas Soome   UINT32                    Cr4;
109*f334afcfSToomas Soome   UINT32                    Eflags;
110*f334afcfSToomas Soome   UINT32                    Ldtr;
111*f334afcfSToomas Soome   UINT32                    Tr;
112*f334afcfSToomas Soome   UINT32                    Gdtr[2];
113*f334afcfSToomas Soome   UINT32                    Idtr[2];
114*f334afcfSToomas Soome   UINT32                    Eip;
115*f334afcfSToomas Soome   UINT32                    Gs;
116*f334afcfSToomas Soome   UINT32                    Fs;
117*f334afcfSToomas Soome   UINT32                    Es;
118*f334afcfSToomas Soome   UINT32                    Ds;
119*f334afcfSToomas Soome   UINT32                    Cs;
120*f334afcfSToomas Soome   UINT32                    Ss;
121*f334afcfSToomas Soome   UINT32                    Edi;
122*f334afcfSToomas Soome   UINT32                    Esi;
123*f334afcfSToomas Soome   UINT32                    Ebp;
124*f334afcfSToomas Soome   UINT32                    Esp;
125*f334afcfSToomas Soome   UINT32                    Ebx;
126*f334afcfSToomas Soome   UINT32                    Edx;
127*f334afcfSToomas Soome   UINT32                    Ecx;
128*f334afcfSToomas Soome   UINT32                    Eax;
129*f334afcfSToomas Soome } EFI_SYSTEM_CONTEXT_IA32;
130*f334afcfSToomas Soome 
131*f334afcfSToomas Soome ///
132*f334afcfSToomas Soome ///  x64 processor exception types.
133*f334afcfSToomas Soome ///
134*f334afcfSToomas Soome #define EXCEPT_X64_DIVIDE_ERROR     0
135*f334afcfSToomas Soome #define EXCEPT_X64_DEBUG            1
136*f334afcfSToomas Soome #define EXCEPT_X64_NMI              2
137*f334afcfSToomas Soome #define EXCEPT_X64_BREAKPOINT       3
138*f334afcfSToomas Soome #define EXCEPT_X64_OVERFLOW         4
139*f334afcfSToomas Soome #define EXCEPT_X64_BOUND            5
140*f334afcfSToomas Soome #define EXCEPT_X64_INVALID_OPCODE   6
141*f334afcfSToomas Soome #define EXCEPT_X64_DOUBLE_FAULT     8
142*f334afcfSToomas Soome #define EXCEPT_X64_INVALID_TSS      10
143*f334afcfSToomas Soome #define EXCEPT_X64_SEG_NOT_PRESENT  11
144*f334afcfSToomas Soome #define EXCEPT_X64_STACK_FAULT      12
145*f334afcfSToomas Soome #define EXCEPT_X64_GP_FAULT         13
146*f334afcfSToomas Soome #define EXCEPT_X64_PAGE_FAULT       14
147*f334afcfSToomas Soome #define EXCEPT_X64_FP_ERROR         16
148*f334afcfSToomas Soome #define EXCEPT_X64_ALIGNMENT_CHECK  17
149*f334afcfSToomas Soome #define EXCEPT_X64_MACHINE_CHECK    18
150*f334afcfSToomas Soome #define EXCEPT_X64_SIMD             19
151*f334afcfSToomas Soome 
152*f334afcfSToomas Soome ///
153*f334afcfSToomas Soome /// FXSAVE_STATE.
154*f334afcfSToomas Soome /// FP / MMX / XMM registers (see fxrstor instruction definition).
155*f334afcfSToomas Soome ///
156*f334afcfSToomas Soome typedef struct {
157*f334afcfSToomas Soome   UINT16    Fcw;
158*f334afcfSToomas Soome   UINT16    Fsw;
159*f334afcfSToomas Soome   UINT16    Ftw;
160*f334afcfSToomas Soome   UINT16    Opcode;
161*f334afcfSToomas Soome   UINT64    Rip;
162*f334afcfSToomas Soome   UINT64    DataOffset;
163*f334afcfSToomas Soome   UINT8     Reserved1[8];
164*f334afcfSToomas Soome   UINT8     St0Mm0[10], Reserved2[6];
165*f334afcfSToomas Soome   UINT8     St1Mm1[10], Reserved3[6];
166*f334afcfSToomas Soome   UINT8     St2Mm2[10], Reserved4[6];
167*f334afcfSToomas Soome   UINT8     St3Mm3[10], Reserved5[6];
168*f334afcfSToomas Soome   UINT8     St4Mm4[10], Reserved6[6];
169*f334afcfSToomas Soome   UINT8     St5Mm5[10], Reserved7[6];
170*f334afcfSToomas Soome   UINT8     St6Mm6[10], Reserved8[6];
171*f334afcfSToomas Soome   UINT8     St7Mm7[10], Reserved9[6];
172*f334afcfSToomas Soome   UINT8     Xmm0[16];
173*f334afcfSToomas Soome   UINT8     Xmm1[16];
174*f334afcfSToomas Soome   UINT8     Xmm2[16];
175*f334afcfSToomas Soome   UINT8     Xmm3[16];
176*f334afcfSToomas Soome   UINT8     Xmm4[16];
177*f334afcfSToomas Soome   UINT8     Xmm5[16];
178*f334afcfSToomas Soome   UINT8     Xmm6[16];
179*f334afcfSToomas Soome   UINT8     Xmm7[16];
180*f334afcfSToomas Soome   //
181*f334afcfSToomas Soome   // NOTE: UEFI 2.0 spec definition as follows.
182*f334afcfSToomas Soome   //
183*f334afcfSToomas Soome   UINT8     Reserved11[14 * 16];
184*f334afcfSToomas Soome } EFI_FX_SAVE_STATE_X64;
185*f334afcfSToomas Soome 
186*f334afcfSToomas Soome ///
187*f334afcfSToomas Soome ///  x64 processor context definition.
188*f334afcfSToomas Soome ///
189*f334afcfSToomas Soome typedef struct {
190*f334afcfSToomas Soome   UINT64                   ExceptionData;
191*f334afcfSToomas Soome   EFI_FX_SAVE_STATE_X64    FxSaveState;
192*f334afcfSToomas Soome   UINT64                   Dr0;
193*f334afcfSToomas Soome   UINT64                   Dr1;
194*f334afcfSToomas Soome   UINT64                   Dr2;
195*f334afcfSToomas Soome   UINT64                   Dr3;
196*f334afcfSToomas Soome   UINT64                   Dr6;
197*f334afcfSToomas Soome   UINT64                   Dr7;
198*f334afcfSToomas Soome   UINT64                   Cr0;
199*f334afcfSToomas Soome   UINT64                   Cr1; /* Reserved */
200*f334afcfSToomas Soome   UINT64                   Cr2;
201*f334afcfSToomas Soome   UINT64                   Cr3;
202*f334afcfSToomas Soome   UINT64                   Cr4;
203*f334afcfSToomas Soome   UINT64                   Cr8;
204*f334afcfSToomas Soome   UINT64                   Rflags;
205*f334afcfSToomas Soome   UINT64                   Ldtr;
206*f334afcfSToomas Soome   UINT64                   Tr;
207*f334afcfSToomas Soome   UINT64                   Gdtr[2];
208*f334afcfSToomas Soome   UINT64                   Idtr[2];
209*f334afcfSToomas Soome   UINT64                   Rip;
210*f334afcfSToomas Soome   UINT64                   Gs;
211*f334afcfSToomas Soome   UINT64                   Fs;
212*f334afcfSToomas Soome   UINT64                   Es;
213*f334afcfSToomas Soome   UINT64                   Ds;
214*f334afcfSToomas Soome   UINT64                   Cs;
215*f334afcfSToomas Soome   UINT64                   Ss;
216*f334afcfSToomas Soome   UINT64                   Rdi;
217*f334afcfSToomas Soome   UINT64                   Rsi;
218*f334afcfSToomas Soome   UINT64                   Rbp;
219*f334afcfSToomas Soome   UINT64                   Rsp;
220*f334afcfSToomas Soome   UINT64                   Rbx;
221*f334afcfSToomas Soome   UINT64                   Rdx;
222*f334afcfSToomas Soome   UINT64                   Rcx;
223*f334afcfSToomas Soome   UINT64                   Rax;
224*f334afcfSToomas Soome   UINT64                   R8;
225*f334afcfSToomas Soome   UINT64                   R9;
226*f334afcfSToomas Soome   UINT64                   R10;
227*f334afcfSToomas Soome   UINT64                   R11;
228*f334afcfSToomas Soome   UINT64                   R12;
229*f334afcfSToomas Soome   UINT64                   R13;
230*f334afcfSToomas Soome   UINT64                   R14;
231*f334afcfSToomas Soome   UINT64                   R15;
232*f334afcfSToomas Soome } EFI_SYSTEM_CONTEXT_X64;
233*f334afcfSToomas Soome 
234*f334afcfSToomas Soome ///
235*f334afcfSToomas Soome ///  Itanium Processor Family Exception types.
236*f334afcfSToomas Soome ///
237*f334afcfSToomas Soome #define EXCEPT_IPF_VHTP_TRANSLATION        0
238*f334afcfSToomas Soome #define EXCEPT_IPF_INSTRUCTION_TLB         1
239*f334afcfSToomas Soome #define EXCEPT_IPF_DATA_TLB                2
240*f334afcfSToomas Soome #define EXCEPT_IPF_ALT_INSTRUCTION_TLB     3
241*f334afcfSToomas Soome #define EXCEPT_IPF_ALT_DATA_TLB            4
242*f334afcfSToomas Soome #define EXCEPT_IPF_DATA_NESTED_TLB         5
243*f334afcfSToomas Soome #define EXCEPT_IPF_INSTRUCTION_KEY_MISSED  6
244*f334afcfSToomas Soome #define EXCEPT_IPF_DATA_KEY_MISSED         7
245*f334afcfSToomas Soome #define EXCEPT_IPF_DIRTY_BIT               8
246*f334afcfSToomas Soome #define EXCEPT_IPF_INSTRUCTION_ACCESS_BIT  9
247*f334afcfSToomas Soome #define EXCEPT_IPF_DATA_ACCESS_BIT         10
248*f334afcfSToomas Soome #define EXCEPT_IPF_BREAKPOINT              11
249*f334afcfSToomas Soome #define EXCEPT_IPF_EXTERNAL_INTERRUPT      12
250*f334afcfSToomas Soome //
251*f334afcfSToomas Soome // 13 - 19 reserved
252*f334afcfSToomas Soome //
253*f334afcfSToomas Soome #define EXCEPT_IPF_PAGE_NOT_PRESENT           20
254*f334afcfSToomas Soome #define EXCEPT_IPF_KEY_PERMISSION             21
255*f334afcfSToomas Soome #define EXCEPT_IPF_INSTRUCTION_ACCESS_RIGHTS  22
256*f334afcfSToomas Soome #define EXCEPT_IPF_DATA_ACCESS_RIGHTS         23
257*f334afcfSToomas Soome #define EXCEPT_IPF_GENERAL_EXCEPTION          24
258*f334afcfSToomas Soome #define EXCEPT_IPF_DISABLED_FP_REGISTER       25
259*f334afcfSToomas Soome #define EXCEPT_IPF_NAT_CONSUMPTION            26
260*f334afcfSToomas Soome #define EXCEPT_IPF_SPECULATION                27
261*f334afcfSToomas Soome //
262*f334afcfSToomas Soome // 28 reserved
263*f334afcfSToomas Soome //
264*f334afcfSToomas Soome #define EXCEPT_IPF_DEBUG                          29
265*f334afcfSToomas Soome #define EXCEPT_IPF_UNALIGNED_REFERENCE            30
266*f334afcfSToomas Soome #define EXCEPT_IPF_UNSUPPORTED_DATA_REFERENCE     31
267*f334afcfSToomas Soome #define EXCEPT_IPF_FP_FAULT                       32
268*f334afcfSToomas Soome #define EXCEPT_IPF_FP_TRAP                        33
269*f334afcfSToomas Soome #define EXCEPT_IPF_LOWER_PRIVILEGE_TRANSFER_TRAP  34
270*f334afcfSToomas Soome #define EXCEPT_IPF_TAKEN_BRANCH                   35
271*f334afcfSToomas Soome #define EXCEPT_IPF_SINGLE_STEP                    36
272*f334afcfSToomas Soome //
273*f334afcfSToomas Soome // 37 - 44 reserved
274*f334afcfSToomas Soome //
275*f334afcfSToomas Soome #define EXCEPT_IPF_IA32_EXCEPTION  45
276*f334afcfSToomas Soome #define EXCEPT_IPF_IA32_INTERCEPT  46
277*f334afcfSToomas Soome #define EXCEPT_IPF_IA32_INTERRUPT  47
278*f334afcfSToomas Soome 
279*f334afcfSToomas Soome ///
280*f334afcfSToomas Soome ///  IPF processor context definition.
281*f334afcfSToomas Soome ///
282*f334afcfSToomas Soome typedef struct {
283*f334afcfSToomas Soome   //
284*f334afcfSToomas Soome   // The first reserved field is necessary to preserve alignment for the correct
285*f334afcfSToomas Soome   // bits in UNAT and to insure F2 is 16 byte aligned.
286*f334afcfSToomas Soome   //
287*f334afcfSToomas Soome   UINT64    Reserved;
288*f334afcfSToomas Soome   UINT64    R1;
289*f334afcfSToomas Soome   UINT64    R2;
290*f334afcfSToomas Soome   UINT64    R3;
291*f334afcfSToomas Soome   UINT64    R4;
292*f334afcfSToomas Soome   UINT64    R5;
293*f334afcfSToomas Soome   UINT64    R6;
294*f334afcfSToomas Soome   UINT64    R7;
295*f334afcfSToomas Soome   UINT64    R8;
296*f334afcfSToomas Soome   UINT64    R9;
297*f334afcfSToomas Soome   UINT64    R10;
298*f334afcfSToomas Soome   UINT64    R11;
299*f334afcfSToomas Soome   UINT64    R12;
300*f334afcfSToomas Soome   UINT64    R13;
301*f334afcfSToomas Soome   UINT64    R14;
302*f334afcfSToomas Soome   UINT64    R15;
303*f334afcfSToomas Soome   UINT64    R16;
304*f334afcfSToomas Soome   UINT64    R17;
305*f334afcfSToomas Soome   UINT64    R18;
306*f334afcfSToomas Soome   UINT64    R19;
307*f334afcfSToomas Soome   UINT64    R20;
308*f334afcfSToomas Soome   UINT64    R21;
309*f334afcfSToomas Soome   UINT64    R22;
310*f334afcfSToomas Soome   UINT64    R23;
311*f334afcfSToomas Soome   UINT64    R24;
312*f334afcfSToomas Soome   UINT64    R25;
313*f334afcfSToomas Soome   UINT64    R26;
314*f334afcfSToomas Soome   UINT64    R27;
315*f334afcfSToomas Soome   UINT64    R28;
316*f334afcfSToomas Soome   UINT64    R29;
317*f334afcfSToomas Soome   UINT64    R30;
318*f334afcfSToomas Soome   UINT64    R31;
319*f334afcfSToomas Soome 
320*f334afcfSToomas Soome   UINT64    F2[2];
321*f334afcfSToomas Soome   UINT64    F3[2];
322*f334afcfSToomas Soome   UINT64    F4[2];
323*f334afcfSToomas Soome   UINT64    F5[2];
324*f334afcfSToomas Soome   UINT64    F6[2];
325*f334afcfSToomas Soome   UINT64    F7[2];
326*f334afcfSToomas Soome   UINT64    F8[2];
327*f334afcfSToomas Soome   UINT64    F9[2];
328*f334afcfSToomas Soome   UINT64    F10[2];
329*f334afcfSToomas Soome   UINT64    F11[2];
330*f334afcfSToomas Soome   UINT64    F12[2];
331*f334afcfSToomas Soome   UINT64    F13[2];
332*f334afcfSToomas Soome   UINT64    F14[2];
333*f334afcfSToomas Soome   UINT64    F15[2];
334*f334afcfSToomas Soome   UINT64    F16[2];
335*f334afcfSToomas Soome   UINT64    F17[2];
336*f334afcfSToomas Soome   UINT64    F18[2];
337*f334afcfSToomas Soome   UINT64    F19[2];
338*f334afcfSToomas Soome   UINT64    F20[2];
339*f334afcfSToomas Soome   UINT64    F21[2];
340*f334afcfSToomas Soome   UINT64    F22[2];
341*f334afcfSToomas Soome   UINT64    F23[2];
342*f334afcfSToomas Soome   UINT64    F24[2];
343*f334afcfSToomas Soome   UINT64    F25[2];
344*f334afcfSToomas Soome   UINT64    F26[2];
345*f334afcfSToomas Soome   UINT64    F27[2];
346*f334afcfSToomas Soome   UINT64    F28[2];
347*f334afcfSToomas Soome   UINT64    F29[2];
348*f334afcfSToomas Soome   UINT64    F30[2];
349*f334afcfSToomas Soome   UINT64    F31[2];
350*f334afcfSToomas Soome 
351*f334afcfSToomas Soome   UINT64    Pr;
352*f334afcfSToomas Soome 
353*f334afcfSToomas Soome   UINT64    B0;
354*f334afcfSToomas Soome   UINT64    B1;
355*f334afcfSToomas Soome   UINT64    B2;
356*f334afcfSToomas Soome   UINT64    B3;
357*f334afcfSToomas Soome   UINT64    B4;
358*f334afcfSToomas Soome   UINT64    B5;
359*f334afcfSToomas Soome   UINT64    B6;
360*f334afcfSToomas Soome   UINT64    B7;
361*f334afcfSToomas Soome 
362*f334afcfSToomas Soome   //
363*f334afcfSToomas Soome   // application registers
364*f334afcfSToomas Soome   //
365*f334afcfSToomas Soome   UINT64    ArRsc;
366*f334afcfSToomas Soome   UINT64    ArBsp;
367*f334afcfSToomas Soome   UINT64    ArBspstore;
368*f334afcfSToomas Soome   UINT64    ArRnat;
369*f334afcfSToomas Soome 
370*f334afcfSToomas Soome   UINT64    ArFcr;
371*f334afcfSToomas Soome 
372*f334afcfSToomas Soome   UINT64    ArEflag;
373*f334afcfSToomas Soome   UINT64    ArCsd;
374*f334afcfSToomas Soome   UINT64    ArSsd;
375*f334afcfSToomas Soome   UINT64    ArCflg;
376*f334afcfSToomas Soome   UINT64    ArFsr;
377*f334afcfSToomas Soome   UINT64    ArFir;
378*f334afcfSToomas Soome   UINT64    ArFdr;
379*f334afcfSToomas Soome 
380*f334afcfSToomas Soome   UINT64    ArCcv;
381*f334afcfSToomas Soome 
382*f334afcfSToomas Soome   UINT64    ArUnat;
383*f334afcfSToomas Soome 
384*f334afcfSToomas Soome   UINT64    ArFpsr;
385*f334afcfSToomas Soome 
386*f334afcfSToomas Soome   UINT64    ArPfs;
387*f334afcfSToomas Soome   UINT64    ArLc;
388*f334afcfSToomas Soome   UINT64    ArEc;
389*f334afcfSToomas Soome 
390*f334afcfSToomas Soome   //
391*f334afcfSToomas Soome   // control registers
392*f334afcfSToomas Soome   //
393*f334afcfSToomas Soome   UINT64    CrDcr;
394*f334afcfSToomas Soome   UINT64    CrItm;
395*f334afcfSToomas Soome   UINT64    CrIva;
396*f334afcfSToomas Soome   UINT64    CrPta;
397*f334afcfSToomas Soome   UINT64    CrIpsr;
398*f334afcfSToomas Soome   UINT64    CrIsr;
399*f334afcfSToomas Soome   UINT64    CrIip;
400*f334afcfSToomas Soome   UINT64    CrIfa;
401*f334afcfSToomas Soome   UINT64    CrItir;
402*f334afcfSToomas Soome   UINT64    CrIipa;
403*f334afcfSToomas Soome   UINT64    CrIfs;
404*f334afcfSToomas Soome   UINT64    CrIim;
405*f334afcfSToomas Soome   UINT64    CrIha;
406*f334afcfSToomas Soome 
407*f334afcfSToomas Soome   //
408*f334afcfSToomas Soome   // debug registers
409*f334afcfSToomas Soome   //
410*f334afcfSToomas Soome   UINT64    Dbr0;
411*f334afcfSToomas Soome   UINT64    Dbr1;
412*f334afcfSToomas Soome   UINT64    Dbr2;
413*f334afcfSToomas Soome   UINT64    Dbr3;
414*f334afcfSToomas Soome   UINT64    Dbr4;
415*f334afcfSToomas Soome   UINT64    Dbr5;
416*f334afcfSToomas Soome   UINT64    Dbr6;
417*f334afcfSToomas Soome   UINT64    Dbr7;
418*f334afcfSToomas Soome 
419*f334afcfSToomas Soome   UINT64    Ibr0;
420*f334afcfSToomas Soome   UINT64    Ibr1;
421*f334afcfSToomas Soome   UINT64    Ibr2;
422*f334afcfSToomas Soome   UINT64    Ibr3;
423*f334afcfSToomas Soome   UINT64    Ibr4;
424*f334afcfSToomas Soome   UINT64    Ibr5;
425*f334afcfSToomas Soome   UINT64    Ibr6;
426*f334afcfSToomas Soome   UINT64    Ibr7;
427*f334afcfSToomas Soome 
428*f334afcfSToomas Soome   //
429*f334afcfSToomas Soome   // virtual registers - nat bits for R1-R31
430*f334afcfSToomas Soome   //
431*f334afcfSToomas Soome   UINT64    IntNat;
432*f334afcfSToomas Soome } EFI_SYSTEM_CONTEXT_IPF;
433*f334afcfSToomas Soome 
434*f334afcfSToomas Soome ///
435*f334afcfSToomas Soome ///  EBC processor exception types.
436*f334afcfSToomas Soome ///
437*f334afcfSToomas Soome #define EXCEPT_EBC_UNDEFINED             0
438*f334afcfSToomas Soome #define EXCEPT_EBC_DIVIDE_ERROR          1
439*f334afcfSToomas Soome #define EXCEPT_EBC_DEBUG                 2
440*f334afcfSToomas Soome #define EXCEPT_EBC_BREAKPOINT            3
441*f334afcfSToomas Soome #define EXCEPT_EBC_OVERFLOW              4
442*f334afcfSToomas Soome #define EXCEPT_EBC_INVALID_OPCODE        5  ///< Opcode out of range.
443*f334afcfSToomas Soome #define EXCEPT_EBC_STACK_FAULT           6
444*f334afcfSToomas Soome #define EXCEPT_EBC_ALIGNMENT_CHECK       7
445*f334afcfSToomas Soome #define EXCEPT_EBC_INSTRUCTION_ENCODING  8  ///< Malformed instruction.
446*f334afcfSToomas Soome #define EXCEPT_EBC_BAD_BREAK             9  ///< BREAK 0 or undefined BREAK.
447*f334afcfSToomas Soome #define EXCEPT_EBC_STEP                  10 ///< To support debug stepping.
448*f334afcfSToomas Soome ///
449*f334afcfSToomas Soome /// For coding convenience, define the maximum valid EBC exception.
450*f334afcfSToomas Soome ///
451*f334afcfSToomas Soome #define MAX_EBC_EXCEPTION  EXCEPT_EBC_STEP
452*f334afcfSToomas Soome 
453*f334afcfSToomas Soome ///
454*f334afcfSToomas Soome ///  EBC processor context definition.
455*f334afcfSToomas Soome ///
456*f334afcfSToomas Soome typedef struct {
457*f334afcfSToomas Soome   UINT64    R0;
458*f334afcfSToomas Soome   UINT64    R1;
459*f334afcfSToomas Soome   UINT64    R2;
460*f334afcfSToomas Soome   UINT64    R3;
461*f334afcfSToomas Soome   UINT64    R4;
462*f334afcfSToomas Soome   UINT64    R5;
463*f334afcfSToomas Soome   UINT64    R6;
464*f334afcfSToomas Soome   UINT64    R7;
465*f334afcfSToomas Soome   UINT64    Flags;
466*f334afcfSToomas Soome   UINT64    ControlFlags;
467*f334afcfSToomas Soome   UINT64    Ip;
468*f334afcfSToomas Soome } EFI_SYSTEM_CONTEXT_EBC;
469*f334afcfSToomas Soome 
470*f334afcfSToomas Soome ///
471*f334afcfSToomas Soome ///  ARM processor exception types.
472*f334afcfSToomas Soome ///
473*f334afcfSToomas Soome #define EXCEPT_ARM_RESET                  0
474*f334afcfSToomas Soome #define EXCEPT_ARM_UNDEFINED_INSTRUCTION  1
475*f334afcfSToomas Soome #define EXCEPT_ARM_SOFTWARE_INTERRUPT     2
476*f334afcfSToomas Soome #define EXCEPT_ARM_PREFETCH_ABORT         3
477*f334afcfSToomas Soome #define EXCEPT_ARM_DATA_ABORT             4
478*f334afcfSToomas Soome #define EXCEPT_ARM_RESERVED               5
479*f334afcfSToomas Soome #define EXCEPT_ARM_IRQ                    6
480*f334afcfSToomas Soome #define EXCEPT_ARM_FIQ                    7
481*f334afcfSToomas Soome 
482*f334afcfSToomas Soome ///
483*f334afcfSToomas Soome /// For coding convenience, define the maximum valid ARM exception.
484*f334afcfSToomas Soome ///
485*f334afcfSToomas Soome #define MAX_ARM_EXCEPTION  EXCEPT_ARM_FIQ
486*f334afcfSToomas Soome 
487*f334afcfSToomas Soome ///
488*f334afcfSToomas Soome ///  ARM processor context definition.
489*f334afcfSToomas Soome ///
490*f334afcfSToomas Soome typedef struct {
491*f334afcfSToomas Soome   UINT32    R0;
492*f334afcfSToomas Soome   UINT32    R1;
493*f334afcfSToomas Soome   UINT32    R2;
494*f334afcfSToomas Soome   UINT32    R3;
495*f334afcfSToomas Soome   UINT32    R4;
496*f334afcfSToomas Soome   UINT32    R5;
497*f334afcfSToomas Soome   UINT32    R6;
498*f334afcfSToomas Soome   UINT32    R7;
499*f334afcfSToomas Soome   UINT32    R8;
500*f334afcfSToomas Soome   UINT32    R9;
501*f334afcfSToomas Soome   UINT32    R10;
502*f334afcfSToomas Soome   UINT32    R11;
503*f334afcfSToomas Soome   UINT32    R12;
504*f334afcfSToomas Soome   UINT32    SP;
505*f334afcfSToomas Soome   UINT32    LR;
506*f334afcfSToomas Soome   UINT32    PC;
507*f334afcfSToomas Soome   UINT32    CPSR;
508*f334afcfSToomas Soome   UINT32    DFSR;
509*f334afcfSToomas Soome   UINT32    DFAR;
510*f334afcfSToomas Soome   UINT32    IFSR;
511*f334afcfSToomas Soome   UINT32    IFAR;
512*f334afcfSToomas Soome } EFI_SYSTEM_CONTEXT_ARM;
513*f334afcfSToomas Soome 
514*f334afcfSToomas Soome ///
515*f334afcfSToomas Soome ///  AARCH64 processor exception types.
516*f334afcfSToomas Soome ///
517*f334afcfSToomas Soome #define EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS  0
518*f334afcfSToomas Soome #define EXCEPT_AARCH64_IRQ                     1
519*f334afcfSToomas Soome #define EXCEPT_AARCH64_FIQ                     2
520*f334afcfSToomas Soome #define EXCEPT_AARCH64_SERROR                  3
521*f334afcfSToomas Soome 
522*f334afcfSToomas Soome ///
523*f334afcfSToomas Soome /// For coding convenience, define the maximum valid ARM exception.
524*f334afcfSToomas Soome ///
525*f334afcfSToomas Soome #define MAX_AARCH64_EXCEPTION  EXCEPT_AARCH64_SERROR
526*f334afcfSToomas Soome 
527*f334afcfSToomas Soome typedef struct {
528*f334afcfSToomas Soome   // General Purpose Registers
529*f334afcfSToomas Soome   UINT64    X0;
530*f334afcfSToomas Soome   UINT64    X1;
531*f334afcfSToomas Soome   UINT64    X2;
532*f334afcfSToomas Soome   UINT64    X3;
533*f334afcfSToomas Soome   UINT64    X4;
534*f334afcfSToomas Soome   UINT64    X5;
535*f334afcfSToomas Soome   UINT64    X6;
536*f334afcfSToomas Soome   UINT64    X7;
537*f334afcfSToomas Soome   UINT64    X8;
538*f334afcfSToomas Soome   UINT64    X9;
539*f334afcfSToomas Soome   UINT64    X10;
540*f334afcfSToomas Soome   UINT64    X11;
541*f334afcfSToomas Soome   UINT64    X12;
542*f334afcfSToomas Soome   UINT64    X13;
543*f334afcfSToomas Soome   UINT64    X14;
544*f334afcfSToomas Soome   UINT64    X15;
545*f334afcfSToomas Soome   UINT64    X16;
546*f334afcfSToomas Soome   UINT64    X17;
547*f334afcfSToomas Soome   UINT64    X18;
548*f334afcfSToomas Soome   UINT64    X19;
549*f334afcfSToomas Soome   UINT64    X20;
550*f334afcfSToomas Soome   UINT64    X21;
551*f334afcfSToomas Soome   UINT64    X22;
552*f334afcfSToomas Soome   UINT64    X23;
553*f334afcfSToomas Soome   UINT64    X24;
554*f334afcfSToomas Soome   UINT64    X25;
555*f334afcfSToomas Soome   UINT64    X26;
556*f334afcfSToomas Soome   UINT64    X27;
557*f334afcfSToomas Soome   UINT64    X28;
558*f334afcfSToomas Soome   UINT64    FP; // x29 - Frame pointer
559*f334afcfSToomas Soome   UINT64    LR; // x30 - Link Register
560*f334afcfSToomas Soome   UINT64    SP; // x31 - Stack pointer
561*f334afcfSToomas Soome 
562*f334afcfSToomas Soome   // FP/SIMD Registers
563*f334afcfSToomas Soome   UINT64    V0[2];
564*f334afcfSToomas Soome   UINT64    V1[2];
565*f334afcfSToomas Soome   UINT64    V2[2];
566*f334afcfSToomas Soome   UINT64    V3[2];
567*f334afcfSToomas Soome   UINT64    V4[2];
568*f334afcfSToomas Soome   UINT64    V5[2];
569*f334afcfSToomas Soome   UINT64    V6[2];
570*f334afcfSToomas Soome   UINT64    V7[2];
571*f334afcfSToomas Soome   UINT64    V8[2];
572*f334afcfSToomas Soome   UINT64    V9[2];
573*f334afcfSToomas Soome   UINT64    V10[2];
574*f334afcfSToomas Soome   UINT64    V11[2];
575*f334afcfSToomas Soome   UINT64    V12[2];
576*f334afcfSToomas Soome   UINT64    V13[2];
577*f334afcfSToomas Soome   UINT64    V14[2];
578*f334afcfSToomas Soome   UINT64    V15[2];
579*f334afcfSToomas Soome   UINT64    V16[2];
580*f334afcfSToomas Soome   UINT64    V17[2];
581*f334afcfSToomas Soome   UINT64    V18[2];
582*f334afcfSToomas Soome   UINT64    V19[2];
583*f334afcfSToomas Soome   UINT64    V20[2];
584*f334afcfSToomas Soome   UINT64    V21[2];
585*f334afcfSToomas Soome   UINT64    V22[2];
586*f334afcfSToomas Soome   UINT64    V23[2];
587*f334afcfSToomas Soome   UINT64    V24[2];
588*f334afcfSToomas Soome   UINT64    V25[2];
589*f334afcfSToomas Soome   UINT64    V26[2];
590*f334afcfSToomas Soome   UINT64    V27[2];
591*f334afcfSToomas Soome   UINT64    V28[2];
592*f334afcfSToomas Soome   UINT64    V29[2];
593*f334afcfSToomas Soome   UINT64    V30[2];
594*f334afcfSToomas Soome   UINT64    V31[2];
595*f334afcfSToomas Soome 
596*f334afcfSToomas Soome   UINT64    ELR;  // Exception Link Register
597*f334afcfSToomas Soome   UINT64    SPSR; // Saved Processor Status Register
598*f334afcfSToomas Soome   UINT64    FPSR; // Floating Point Status Register
599*f334afcfSToomas Soome   UINT64    ESR;  // Exception syndrome register
600*f334afcfSToomas Soome   UINT64    FAR;  // Fault Address Register
601*f334afcfSToomas Soome } EFI_SYSTEM_CONTEXT_AARCH64;
602*f334afcfSToomas Soome 
603*f334afcfSToomas Soome ///
604*f334afcfSToomas Soome /// RISC-V processor exception types.
605*f334afcfSToomas Soome ///
606*f334afcfSToomas Soome #define EXCEPT_RISCV_INST_MISALIGNED               0
607*f334afcfSToomas Soome #define EXCEPT_RISCV_INST_ACCESS_FAULT             1
608*f334afcfSToomas Soome #define EXCEPT_RISCV_ILLEGAL_INST                  2
609*f334afcfSToomas Soome #define EXCEPT_RISCV_BREAKPOINT                    3
610*f334afcfSToomas Soome #define EXCEPT_RISCV_LOAD_ADDRESS_MISALIGNED       4
611*f334afcfSToomas Soome #define EXCEPT_RISCV_LOAD_ACCESS_FAULT             5
612*f334afcfSToomas Soome #define EXCEPT_RISCV_STORE_AMO_ADDRESS_MISALIGNED  6
613*f334afcfSToomas Soome #define EXCEPT_RISCV_STORE_AMO_ACCESS_FAULT        7
614*f334afcfSToomas Soome #define EXCEPT_RISCV_ENV_CALL_FROM_UMODE           8
615*f334afcfSToomas Soome #define EXCEPT_RISCV_ENV_CALL_FROM_SMODE           9
616*f334afcfSToomas Soome #define EXCEPT_RISCV_ENV_CALL_FROM_HMODE           10
617*f334afcfSToomas Soome #define EXCEPT_RISCV_ENV_CALL_FROM_MMODE           11
618*f334afcfSToomas Soome 
619*f334afcfSToomas Soome #define EXCEPT_RISCV_SOFTWARE_INT  0x0
620*f334afcfSToomas Soome #define EXCEPT_RISCV_TIMER_INT     0x1
621*f334afcfSToomas Soome 
622*f334afcfSToomas Soome typedef struct {
623*f334afcfSToomas Soome   UINT64    X0;
624*f334afcfSToomas Soome   UINT64    X1;
625*f334afcfSToomas Soome   UINT64    X2;
626*f334afcfSToomas Soome   UINT64    X3;
627*f334afcfSToomas Soome   UINT64    X4;
628*f334afcfSToomas Soome   UINT64    X5;
629*f334afcfSToomas Soome   UINT64    X6;
630*f334afcfSToomas Soome   UINT64    X7;
631*f334afcfSToomas Soome   UINT64    X8;
632*f334afcfSToomas Soome   UINT64    X9;
633*f334afcfSToomas Soome   UINT64    X10;
634*f334afcfSToomas Soome   UINT64    X11;
635*f334afcfSToomas Soome   UINT64    X12;
636*f334afcfSToomas Soome   UINT64    X13;
637*f334afcfSToomas Soome   UINT64    X14;
638*f334afcfSToomas Soome   UINT64    X15;
639*f334afcfSToomas Soome   UINT64    X16;
640*f334afcfSToomas Soome   UINT64    X17;
641*f334afcfSToomas Soome   UINT64    X18;
642*f334afcfSToomas Soome   UINT64    X19;
643*f334afcfSToomas Soome   UINT64    X20;
644*f334afcfSToomas Soome   UINT64    X21;
645*f334afcfSToomas Soome   UINT64    X22;
646*f334afcfSToomas Soome   UINT64    X23;
647*f334afcfSToomas Soome   UINT64    X24;
648*f334afcfSToomas Soome   UINT64    X25;
649*f334afcfSToomas Soome   UINT64    X26;
650*f334afcfSToomas Soome   UINT64    X27;
651*f334afcfSToomas Soome   UINT64    X28;
652*f334afcfSToomas Soome   UINT64    X29;
653*f334afcfSToomas Soome   UINT64    X30;
654*f334afcfSToomas Soome   UINT64    X31;
655*f334afcfSToomas Soome } EFI_SYSTEM_CONTEXT_RISCV64;
656*f334afcfSToomas Soome 
657*f334afcfSToomas Soome ///
658*f334afcfSToomas Soome /// Universal EFI_SYSTEM_CONTEXT definition.
659*f334afcfSToomas Soome ///
660*f334afcfSToomas Soome typedef union {
661*f334afcfSToomas Soome   EFI_SYSTEM_CONTEXT_EBC        *SystemContextEbc;
662*f334afcfSToomas Soome   EFI_SYSTEM_CONTEXT_IA32       *SystemContextIa32;
663*f334afcfSToomas Soome   EFI_SYSTEM_CONTEXT_X64        *SystemContextX64;
664*f334afcfSToomas Soome   EFI_SYSTEM_CONTEXT_IPF        *SystemContextIpf;
665*f334afcfSToomas Soome   EFI_SYSTEM_CONTEXT_ARM        *SystemContextArm;
666*f334afcfSToomas Soome   EFI_SYSTEM_CONTEXT_AARCH64    *SystemContextAArch64;
667*f334afcfSToomas Soome   EFI_SYSTEM_CONTEXT_RISCV64    *SystemContextRiscV64;
668*f334afcfSToomas Soome } EFI_SYSTEM_CONTEXT;
669*f334afcfSToomas Soome 
670*f334afcfSToomas Soome //
671*f334afcfSToomas Soome // DebugSupport callback function prototypes
672*f334afcfSToomas Soome //
673*f334afcfSToomas Soome 
674*f334afcfSToomas Soome /**
675*f334afcfSToomas Soome   Registers and enables an exception callback function for the specified exception.
676*f334afcfSToomas Soome 
677*f334afcfSToomas Soome   @param  ExceptionType         Exception types in EBC, IA-32, x64, or IPF.
678*f334afcfSToomas Soome   @param  SystemContext         Exception content.
679*f334afcfSToomas Soome 
680*f334afcfSToomas Soome **/
681*f334afcfSToomas Soome typedef
682*f334afcfSToomas Soome VOID
683*f334afcfSToomas Soome (EFIAPI *EFI_EXCEPTION_CALLBACK)(
684*f334afcfSToomas Soome   IN     EFI_EXCEPTION_TYPE               ExceptionType,
685*f334afcfSToomas Soome   IN OUT EFI_SYSTEM_CONTEXT               SystemContext
686*f334afcfSToomas Soome   );
687*f334afcfSToomas Soome 
688*f334afcfSToomas Soome /**
689*f334afcfSToomas Soome   Registers and enables the on-target debug agent's periodic entry point.
690*f334afcfSToomas Soome 
691*f334afcfSToomas Soome   @param  SystemContext         Exception content.
692*f334afcfSToomas Soome 
693*f334afcfSToomas Soome **/
694*f334afcfSToomas Soome typedef
695*f334afcfSToomas Soome VOID
696*f334afcfSToomas Soome (EFIAPI *EFI_PERIODIC_CALLBACK)(
697*f334afcfSToomas Soome   IN OUT EFI_SYSTEM_CONTEXT               SystemContext
698*f334afcfSToomas Soome   );
699*f334afcfSToomas Soome 
700*f334afcfSToomas Soome ///
701*f334afcfSToomas Soome /// Machine type definition
702*f334afcfSToomas Soome ///
703*f334afcfSToomas Soome typedef enum {
704*f334afcfSToomas Soome   IsaIa32    = IMAGE_FILE_MACHINE_I386,           ///< 0x014C
705*f334afcfSToomas Soome   IsaX64     = IMAGE_FILE_MACHINE_X64,            ///< 0x8664
706*f334afcfSToomas Soome   IsaIpf     = IMAGE_FILE_MACHINE_IA64,           ///< 0x0200
707*f334afcfSToomas Soome   IsaEbc     = IMAGE_FILE_MACHINE_EBC,            ///< 0x0EBC
708*f334afcfSToomas Soome   IsaArm     = IMAGE_FILE_MACHINE_ARMTHUMB_MIXED, ///< 0x01c2
709*f334afcfSToomas Soome   IsaAArch64 = IMAGE_FILE_MACHINE_ARM64           ///< 0xAA64
710*f334afcfSToomas Soome } EFI_INSTRUCTION_SET_ARCHITECTURE;
711*f334afcfSToomas Soome 
712*f334afcfSToomas Soome //
713*f334afcfSToomas Soome // DebugSupport member function definitions
714*f334afcfSToomas Soome //
715*f334afcfSToomas Soome 
716*f334afcfSToomas Soome /**
717*f334afcfSToomas Soome   Returns the maximum value that may be used for the ProcessorIndex parameter in
718*f334afcfSToomas Soome   RegisterPeriodicCallback() and RegisterExceptionCallback().
719*f334afcfSToomas Soome 
720*f334afcfSToomas Soome   @param  This                  A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.
721*f334afcfSToomas Soome   @param  MaxProcessorIndex     Pointer to a caller-allocated UINTN in which the maximum supported
722*f334afcfSToomas Soome                                 processor index is returned.
723*f334afcfSToomas Soome 
724*f334afcfSToomas Soome   @retval EFI_SUCCESS           The function completed successfully.
725*f334afcfSToomas Soome 
726*f334afcfSToomas Soome **/
727*f334afcfSToomas Soome typedef
728*f334afcfSToomas Soome EFI_STATUS
729*f334afcfSToomas Soome (EFIAPI *EFI_GET_MAXIMUM_PROCESSOR_INDEX)(
730*f334afcfSToomas Soome   IN EFI_DEBUG_SUPPORT_PROTOCOL          *This,
731*f334afcfSToomas Soome   OUT UINTN                              *MaxProcessorIndex
732*f334afcfSToomas Soome   );
733*f334afcfSToomas Soome 
734*f334afcfSToomas Soome /**
735*f334afcfSToomas Soome   Registers a function to be called back periodically in interrupt context.
736*f334afcfSToomas Soome 
737*f334afcfSToomas Soome   @param  This                  A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.
738*f334afcfSToomas Soome   @param  ProcessorIndex        Specifies which processor the callback function applies to.
739*f334afcfSToomas Soome   @param  PeriodicCallback      A pointer to a function of type PERIODIC_CALLBACK that is the main
740*f334afcfSToomas Soome                                 periodic entry point of the debug agent.
741*f334afcfSToomas Soome 
742*f334afcfSToomas Soome   @retval EFI_SUCCESS           The function completed successfully.
743*f334afcfSToomas Soome   @retval EFI_ALREADY_STARTED   Non-NULL PeriodicCallback parameter when a callback
744*f334afcfSToomas Soome                                 function was previously registered.
745*f334afcfSToomas Soome   @retval EFI_OUT_OF_RESOURCES  System has insufficient memory resources to register new callback
746*f334afcfSToomas Soome                                 function.
747*f334afcfSToomas Soome 
748*f334afcfSToomas Soome **/
749*f334afcfSToomas Soome typedef
750*f334afcfSToomas Soome EFI_STATUS
751*f334afcfSToomas Soome (EFIAPI *EFI_REGISTER_PERIODIC_CALLBACK)(
752*f334afcfSToomas Soome   IN EFI_DEBUG_SUPPORT_PROTOCOL          *This,
753*f334afcfSToomas Soome   IN UINTN                               ProcessorIndex,
754*f334afcfSToomas Soome   IN EFI_PERIODIC_CALLBACK               PeriodicCallback
755*f334afcfSToomas Soome   );
756*f334afcfSToomas Soome 
757*f334afcfSToomas Soome /**
758*f334afcfSToomas Soome   Registers a function to be called when a given processor exception occurs.
759*f334afcfSToomas Soome 
760*f334afcfSToomas Soome   @param  This                  A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.
761*f334afcfSToomas Soome   @param  ProcessorIndex        Specifies which processor the callback function applies to.
762*f334afcfSToomas Soome   @param  ExceptionCallback     A pointer to a function of type EXCEPTION_CALLBACK that is called
763*f334afcfSToomas Soome                                 when the processor exception specified by ExceptionType occurs.
764*f334afcfSToomas Soome   @param  ExceptionType         Specifies which processor exception to hook.
765*f334afcfSToomas Soome 
766*f334afcfSToomas Soome   @retval EFI_SUCCESS           The function completed successfully.
767*f334afcfSToomas Soome   @retval EFI_ALREADY_STARTED   Non-NULL PeriodicCallback parameter when a callback
768*f334afcfSToomas Soome                                 function was previously registered.
769*f334afcfSToomas Soome   @retval EFI_OUT_OF_RESOURCES  System has insufficient memory resources to register new callback
770*f334afcfSToomas Soome                                 function.
771*f334afcfSToomas Soome 
772*f334afcfSToomas Soome **/
773*f334afcfSToomas Soome typedef
774*f334afcfSToomas Soome EFI_STATUS
775*f334afcfSToomas Soome (EFIAPI *EFI_REGISTER_EXCEPTION_CALLBACK)(
776*f334afcfSToomas Soome   IN EFI_DEBUG_SUPPORT_PROTOCOL          *This,
777*f334afcfSToomas Soome   IN UINTN                               ProcessorIndex,
778*f334afcfSToomas Soome   IN EFI_EXCEPTION_CALLBACK              ExceptionCallback,
779*f334afcfSToomas Soome   IN EFI_EXCEPTION_TYPE                  ExceptionType
780*f334afcfSToomas Soome   );
781*f334afcfSToomas Soome 
782*f334afcfSToomas Soome /**
783*f334afcfSToomas Soome   Invalidates processor instruction cache for a memory range. Subsequent execution in this range
784*f334afcfSToomas Soome   causes a fresh memory fetch to retrieve code to be executed.
785*f334afcfSToomas Soome 
786*f334afcfSToomas Soome   @param  This                  A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.
787*f334afcfSToomas Soome   @param  ProcessorIndex        Specifies which processor's instruction cache is to be invalidated.
788*f334afcfSToomas Soome   @param  Start                 Specifies the physical base of the memory range to be invalidated.
789*f334afcfSToomas Soome   @param  Length                Specifies the minimum number of bytes in the processor's instruction
790*f334afcfSToomas Soome                                 cache to invalidate.
791*f334afcfSToomas Soome 
792*f334afcfSToomas Soome   @retval EFI_SUCCESS           The function completed successfully.
793*f334afcfSToomas Soome 
794*f334afcfSToomas Soome **/
795*f334afcfSToomas Soome typedef
796*f334afcfSToomas Soome EFI_STATUS
797*f334afcfSToomas Soome (EFIAPI *EFI_INVALIDATE_INSTRUCTION_CACHE)(
798*f334afcfSToomas Soome   IN EFI_DEBUG_SUPPORT_PROTOCOL          *This,
799*f334afcfSToomas Soome   IN UINTN                               ProcessorIndex,
800*f334afcfSToomas Soome   IN VOID                                *Start,
801*f334afcfSToomas Soome   IN UINT64                              Length
802*f334afcfSToomas Soome   );
803*f334afcfSToomas Soome 
804*f334afcfSToomas Soome ///
805*f334afcfSToomas Soome /// This protocol provides the services to allow the debug agent to register
806*f334afcfSToomas Soome /// callback functions that are called either periodically or when specific
807*f334afcfSToomas Soome /// processor exceptions occur.
808*f334afcfSToomas Soome ///
809*f334afcfSToomas Soome struct _EFI_DEBUG_SUPPORT_PROTOCOL {
810*f334afcfSToomas Soome   ///
811*f334afcfSToomas Soome   /// Declares the processor architecture for this instance of the EFI Debug Support protocol.
812*f334afcfSToomas Soome   ///
813*f334afcfSToomas Soome   EFI_INSTRUCTION_SET_ARCHITECTURE    Isa;
814*f334afcfSToomas Soome   EFI_GET_MAXIMUM_PROCESSOR_INDEX     GetMaximumProcessorIndex;
815*f334afcfSToomas Soome   EFI_REGISTER_PERIODIC_CALLBACK      RegisterPeriodicCallback;
816*f334afcfSToomas Soome   EFI_REGISTER_EXCEPTION_CALLBACK     RegisterExceptionCallback;
817*f334afcfSToomas Soome   EFI_INVALIDATE_INSTRUCTION_CACHE    InvalidateInstructionCache;
818*f334afcfSToomas Soome };
819*f334afcfSToomas Soome 
820*f334afcfSToomas Soome extern EFI_GUID  gEfiDebugSupportProtocolGuid;
821*f334afcfSToomas Soome 
822*f334afcfSToomas Soome #endif
823