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