blob: fdefeae43102bc0c0c539fd99f43f1f373607398 [file] [log] [blame]
Lawrence Tang2800cd82022-07-05 16:08:20 +01001#ifndef CPER_SECTION_ARM_H
2#define CPER_SECTION_ARM_H
3
Karthik Rajagopalan255bd812024-09-06 14:36:34 -07004#ifdef __cplusplus
5extern "C" {
6#endif
7
Lawrence Tang5202bbb2022-08-12 14:54:36 +01008#include <json.h>
Lawrence Tang2800cd82022-07-05 16:08:20 +01009#include "../edk/Cper.h"
10
John Chungf8fc7052024-05-03 20:05:29 +080011#define ARM_ERROR_VALID_BITFIELD_NAMES \
12 (const char *[]) \
13 { \
14 "mpidrValid", "errorAffinityLevelValid", "runningStateValid", \
15 "vendorSpecificInfoValid" \
16 }
17#define ARM_ERROR_INFO_ENTRY_VALID_BITFIELD_NAMES \
18 (const char *[]) \
19 { \
20 "multipleErrorValid", "flagsValid", "errorInformationValid", \
21 "virtualFaultAddressValid", \
22 "physicalFaultAddressValid" \
23 }
24#define ARM_ERROR_INFO_ENTRY_FLAGS_NAMES \
25 (const char *[]) \
26 { \
27 "firstErrorCaptured", "lastErrorCaptured", "propagated", \
28 "overflow" \
29 }
30#define ARM_CACHE_TLB_ERROR_VALID_BITFIELD_NAMES \
31 (const char *[]) \
32 { \
33 "transactionTypeValid", "operationValid", "levelValid", \
34 "processorContextCorruptValid", "correctedValid", \
35 "precisePCValid", "restartablePCValid" \
36 }
37#define ARM_BUS_ERROR_VALID_BITFIELD_NAMES \
38 (const char *[]) \
39 { \
40 "transactionTypeValid", "operationValid", "levelValid", \
41 "processorContextCorruptValid", "correctedValid", \
42 "precisePCValid", "restartablePCValid", \
43 "participationTypeValid", "timedOutValid", \
44 "addressSpaceValid", "memoryAttributesValid", \
45 "accessModeValid" \
46 }
47#define ARM_ERROR_TRANSACTION_TYPES_KEYS \
48 (int[]) \
49 { \
50 0, 1, 2 \
51 }
52#define ARM_ERROR_TRANSACTION_TYPES_VALUES \
53 (const char *[]) \
54 { \
55 "Instruction", "Data Access", "Generic" \
56 }
57#define ARM_ERROR_INFO_ENTRY_INFO_TYPES_KEYS \
58 (int[]) \
59 { \
60 0, 1, 2, 3 \
61 }
62#define ARM_ERROR_INFO_ENTRY_INFO_TYPES_VALUES \
63 (const char *[]) \
64 { \
65 "Cache Error", "TLB Error", "Bus Error", \
66 "Micro-Architectural Error" \
67 }
68#define ARM_CACHE_BUS_OPERATION_TYPES_KEYS \
69 (int[]) \
70 { \
71 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 \
72 }
73#define ARM_CACHE_BUS_OPERATION_TYPES_VALUES \
74 (const char *[]) \
75 { \
76 "Generic Error", "Generic Read", "Generic Write", "Data Read", \
77 "Data Write", "Instruction Fetch", "Prefetch", \
78 "Eviction", "Snooping", "Snooped", "Management" \
79 }
80#define ARM_TLB_OPERATION_TYPES_KEYS \
81 (int[]) \
82 { \
83 0, 1, 2, 3, 4, 5, 6, 7, 8 \
84 }
85#define ARM_TLB_OPERATION_TYPES_VALUES \
86 (const char *[]) \
87 { \
88 "Generic Error", "Generic Read", "Generic Write", "Data Read", \
89 "Data Write", "Instruction Fetch", "Prefetch", \
90 "Local Management Operation", \
91 "External Management Operation" \
92 }
93#define ARM_BUS_PARTICIPATION_TYPES_KEYS \
94 (int[]) \
95 { \
96 0, 1, 2, 3 \
97 }
98#define ARM_BUS_PARTICIPATION_TYPES_VALUES \
99 (const char *[]) \
100 { \
101 "Local Processor Originated Request", \
102 "Local Processor Responded to Request", \
103 "Local Processor Observed", "Generic" \
104 }
105#define ARM_BUS_ADDRESS_SPACE_TYPES_KEYS \
106 (int[]) \
107 { \
108 0, 1, 3 \
109 }
110#define ARM_BUS_ADDRESS_SPACE_TYPES_VALUES \
111 (const char *[]) \
112 { \
113 "External Memory Access", "Internal Memory Access", \
114 "Device Memory Access" \
115 }
116#define ARM_PROCESSOR_INFO_REGISTER_CONTEXT_TYPES_KEYS \
117 (int[]) \
118 { \
119 0, 1, 2, 3, 4, 5, 6, 7, 8 \
120 }
121#define ARM_PROCESSOR_INFO_REGISTER_CONTEXT_TYPES_VALUES \
122 (const char *[]) \
123 { \
124 "AArch32 General Purpose Registers", \
125 "AArch32 EL1 Context Registers", \
126 "AArch32 EL2 Context Registers", \
127 "AArch32 Secure Context Registers", \
128 "AArch64 General Purpose Registers", \
129 "AArch64 EL1 Context Registers", \
130 "AArch64 EL2 Context Registers", \
131 "AArch64 EL3 Context Registers", \
132 "Miscellaneous System Register Structure" \
133 }
134#define ARM_AARCH32_GPR_NAMES \
135 (const char *[]) \
136 { \
137 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", \
138 "r10", "r11", "r12", "r13_sp", "r14_lr", "r15_pc" \
139 }
140#define ARM_AARCH32_EL1_REGISTER_NAMES \
141 (const char *[]) \
142 { \
143 "dfar", "dfsr", "ifar", "isr", "mair0", "mair1", "midr", \
144 "mpidr", "nmrr", "prrr", "sctlr_ns", "spsr", \
145 "spsr_abt", "spsr_fiq", "spsr_irq", "spsr_svc", \
146 "spsr_und", "tpidrprw", "tpidruro", "tpidrurw", \
147 "ttbcr", "ttbr0", "ttbr1", "dacr" \
148 }
149#define ARM_AARCH32_EL2_REGISTER_NAMES \
150 (const char *[]) \
151 { \
152 "elr_hyp", "hamair0", "hamair1", "hcr", "hcr2", "hdfar", \
153 "hifar", "hpfar", "hsr", "htcr", "htpidr", "httbr", \
154 "spsr_hyp", "vtcr", "vttbr", "dacr32_el2" \
155 }
156#define ARM_AARCH32_SECURE_REGISTER_NAMES \
157 (const char *[]) \
158 { \
159 "sctlr_s", "spsr_mon" \
160 }
161#define ARM_AARCH64_GPR_NAMES \
162 (const char *[]) \
163 { \
164 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", \
165 "x10", "x11", "x12", "x13", "x14", "x15", "x16", \
166 "x17", "x18", "x19", "x20", "x21", "x22", "x23", \
167 "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp" \
168 }
169#define ARM_AARCH64_EL1_REGISTER_NAMES \
170 (const char *[]) \
171 { \
172 "elr_el1", "esr_el1", "far_el1", "isr_el1", "mair_el1", \
173 "midr_el1", "mpidr_el1", "sctlr_el1", "sp_el0", \
174 "sp_el1", "spsr_el1", "tcr_el1", "tpidr_el0", \
175 "tpidr_el1", "tpidrro_el0", "ttbr0_el1", "ttbr1_el1" \
176 }
177#define ARM_AARCH64_EL2_REGISTER_NAMES \
178 (const char *[]) \
179 { \
180 "elr_el2", "esr_el2", "far_el2", "hacr_el2", "hcr_el2", \
181 "hpfar_el2", "mair_el2", "sctlr_el2", "sp_el2", \
182 "spsr_el2", "tcr_el2", "tpidr_el2", "ttbr0_el2", \
183 "vtcr_el2", "vttbr_el2" \
184 }
185#define ARM_AARCH64_EL3_REGISTER_NAMES \
186 (const char *[]) \
187 { \
188 "elr_el3", "esr_el3", "far_el3", "mair_el3", "sctlr_el3", \
189 "sp_el3", "spsr_el3", "tcr_el3", "tpidr_el3", \
190 "ttbr0_el3" \
191 }
Lawrence Tang3d0e4f22022-07-05 17:17:41 +0100192
Lawrence Tang4dbe3d72022-07-06 13:51:01 +0100193///
194/// ARM Processor Error Record
195///
196typedef struct {
John Chungf8fc7052024-05-03 20:05:29 +0800197 UINT32 ValidFields;
198 UINT16 ErrInfoNum;
199 UINT16 ContextInfoNum;
200 UINT32 SectionLength;
201 UINT32 ErrorAffinityLevel;
202 UINT64 MPIDR_EL1;
203 UINT64 MIDR_EL1;
204 UINT32 RunningState;
205 UINT32 PsciState;
Lawrence Tangefe17e22022-08-08 09:16:23 +0100206} __attribute__((packed, aligned(1))) EFI_ARM_ERROR_RECORD;
Lawrence Tang4dbe3d72022-07-06 13:51:01 +0100207
208///
209/// ARM Processor Error Information Structure
210///
John Chungf8fc7052024-05-03 20:05:29 +0800211#define ARM_ERROR_INFORMATION_TYPE_CACHE 0
212#define ARM_ERROR_INFORMATION_TYPE_TLB 1
213#define ARM_ERROR_INFORMATION_TYPE_BUS 2
Lawrence Tang71570a22022-07-14 11:45:28 +0100214#define ARM_ERROR_INFORMATION_TYPE_MICROARCH 3
215
Lawrence Tang4dbe3d72022-07-06 13:51:01 +0100216typedef struct {
John Chungf8fc7052024-05-03 20:05:29 +0800217 UINT64 ValidationBits : 16;
218 UINT64 TransactionType : 2;
219 UINT64 Operation : 4;
220 UINT64 Level : 3;
221 UINT64 ProcessorContextCorrupt : 1;
222 UINT64 Corrected : 1;
223 UINT64 PrecisePC : 1;
224 UINT64 RestartablePC : 1;
225 UINT64 Reserved : 34;
Lawrence Tang4dbe3d72022-07-06 13:51:01 +0100226} EFI_ARM_CACHE_ERROR_STRUCTURE;
227
228typedef struct {
John Chungf8fc7052024-05-03 20:05:29 +0800229 UINT64 ValidationBits : 16;
230 UINT64 TransactionType : 2;
231 UINT64 Operation : 4;
232 UINT64 Level : 3;
233 UINT64 ProcessorContextCorrupt : 1;
234 UINT64 Corrected : 1;
235 UINT64 PrecisePC : 1;
236 UINT64 RestartablePC : 1;
237 UINT64 Reserved : 34;
Lawrence Tang4dbe3d72022-07-06 13:51:01 +0100238} EFI_ARM_TLB_ERROR_STRUCTURE;
239
240typedef struct {
John Chungf8fc7052024-05-03 20:05:29 +0800241 UINT64 ValidationBits : 16;
242 UINT64 TransactionType : 2;
243 UINT64 Operation : 4;
244 UINT64 Level : 3;
245 UINT64 ProcessorContextCorrupt : 1;
246 UINT64 Corrected : 1;
247 UINT64 PrecisePC : 1;
248 UINT64 RestartablePC : 1;
249 UINT64 ParticipationType : 2;
250 UINT64 TimeOut : 1;
251 UINT64 AddressSpace : 2;
252 UINT64 MemoryAddressAttributes : 8;
253 UINT64 AccessMode : 1;
254 UINT64 Reserved : 19;
Lawrence Tang4dbe3d72022-07-06 13:51:01 +0100255} EFI_ARM_BUS_ERROR_STRUCTURE;
256
257typedef union {
John Chung0b9c9402024-05-22 22:52:55 +0800258 UINT64 Value;
John Chungf8fc7052024-05-03 20:05:29 +0800259 EFI_ARM_CACHE_ERROR_STRUCTURE CacheError;
260 EFI_ARM_TLB_ERROR_STRUCTURE TlbError;
261 EFI_ARM_BUS_ERROR_STRUCTURE BusError;
Lawrence Tang4dbe3d72022-07-06 13:51:01 +0100262} EFI_ARM_ERROR_INFORMATION_STRUCTURE;
263
264typedef struct {
John Chungf8fc7052024-05-03 20:05:29 +0800265 UINT8 Version;
266 UINT8 Length;
267 UINT16 ValidationBits;
268 UINT8 Type;
269 UINT16 MultipleError;
270 UINT8 Flags;
271 EFI_ARM_ERROR_INFORMATION_STRUCTURE ErrorInformation;
272 UINT64 VirtualFaultAddress;
273 UINT64 PhysicalFaultAddress;
Lawrence Tang71570a22022-07-14 11:45:28 +0100274} __attribute__((packed, aligned(1))) EFI_ARM_ERROR_INFORMATION_ENTRY;
Lawrence Tang4dbe3d72022-07-06 13:51:01 +0100275
276///
277/// ARM Processor Context Information Structure
278///
279typedef struct {
John Chungf8fc7052024-05-03 20:05:29 +0800280 UINT16 Version;
281 UINT16 RegisterContextType;
282 UINT32 RegisterArraySize;
Lawrence Tangefe17e22022-08-08 09:16:23 +0100283} __attribute__((packed, aligned(1))) EFI_ARM_CONTEXT_INFORMATION_HEADER;
Lawrence Tang4dbe3d72022-07-06 13:51:01 +0100284
285///
286/// ARM Processor Context Register Types
287///
John Chungf8fc7052024-05-03 20:05:29 +0800288#define EFI_ARM_CONTEXT_TYPE_AARCH32_GPR 0
289#define EFI_ARM_CONTEXT_TYPE_AARCH32_EL1 1
290#define EFI_ARM_CONTEXT_TYPE_AARCH32_EL2 2
Lawrence Tang4dbe3d72022-07-06 13:51:01 +0100291#define EFI_ARM_CONTEXT_TYPE_AARCH32_SECURE 3
John Chungf8fc7052024-05-03 20:05:29 +0800292#define EFI_ARM_CONTEXT_TYPE_AARCH64_GPR 4
293#define EFI_ARM_CONTEXT_TYPE_AARCH64_EL1 5
294#define EFI_ARM_CONTEXT_TYPE_AARCH64_EL2 6
295#define EFI_ARM_CONTEXT_TYPE_AARCH64_EL3 7
296#define EFI_ARM_CONTEXT_TYPE_MISC 8
Lawrence Tang4dbe3d72022-07-06 13:51:01 +0100297
298typedef struct {
John Chungf8fc7052024-05-03 20:05:29 +0800299 UINT32 R0;
300 UINT32 R1;
301 UINT32 R2;
302 UINT32 R3;
303 UINT32 R4;
304 UINT32 R5;
305 UINT32 R6;
306 UINT32 R7;
307 UINT32 R8;
308 UINT32 R9;
309 UINT32 R10;
310 UINT32 R11;
311 UINT32 R12;
312 UINT32 R13_sp;
313 UINT32 R14_lr;
314 UINT32 R15_pc;
Lawrence Tang4dbe3d72022-07-06 13:51:01 +0100315} EFI_ARM_V8_AARCH32_GPR;
316
317typedef struct {
John Chungf8fc7052024-05-03 20:05:29 +0800318 UINT32 Dfar;
319 UINT32 Dfsr;
320 UINT32 Ifar;
321 UINT32 Isr;
322 UINT32 Mair0;
323 UINT32 Mair1;
324 UINT32 Midr;
325 UINT32 Mpidr;
326 UINT32 Nmrr;
327 UINT32 Prrr;
328 UINT32 Sctlr_Ns;
329 UINT32 Spsr;
330 UINT32 Spsr_Abt;
331 UINT32 Spsr_Fiq;
332 UINT32 Spsr_Irq;
333 UINT32 Spsr_Svc;
334 UINT32 Spsr_Und;
335 UINT32 Tpidrprw;
336 UINT32 Tpidruro;
337 UINT32 Tpidrurw;
338 UINT32 Ttbcr;
339 UINT32 Ttbr0;
340 UINT32 Ttbr1;
341 UINT32 Dacr;
Lawrence Tang4dbe3d72022-07-06 13:51:01 +0100342} EFI_ARM_AARCH32_EL1_CONTEXT_REGISTERS;
343
344typedef struct {
John Chungf8fc7052024-05-03 20:05:29 +0800345 UINT32 Elr_Hyp;
346 UINT32 Hamair0;
347 UINT32 Hamair1;
348 UINT32 Hcr;
349 UINT32 Hcr2;
350 UINT32 Hdfar;
351 UINT32 Hifar;
352 UINT32 Hpfar;
353 UINT32 Hsr;
354 UINT32 Htcr;
355 UINT32 Htpidr;
356 UINT32 Httbr;
357 UINT32 Spsr_Hyp;
358 UINT32 Vtcr;
359 UINT32 Vttbr;
360 UINT32 Dacr32_El2;
Lawrence Tang4dbe3d72022-07-06 13:51:01 +0100361} EFI_ARM_AARCH32_EL2_CONTEXT_REGISTERS;
362
363typedef struct {
John Chungf8fc7052024-05-03 20:05:29 +0800364 UINT32 Sctlr_S;
365 UINT32 Spsr_Mon;
Lawrence Tang4dbe3d72022-07-06 13:51:01 +0100366} EFI_ARM_AARCH32_SECURE_CONTEXT_REGISTERS;
367
368typedef struct {
John Chungf8fc7052024-05-03 20:05:29 +0800369 UINT64 X0;
370 UINT64 X1;
371 UINT64 X2;
372 UINT64 X3;
373 UINT64 X4;
374 UINT64 X5;
375 UINT64 X6;
376 UINT64 X7;
377 UINT64 X8;
378 UINT64 X9;
379 UINT64 X10;
380 UINT64 X11;
381 UINT64 X12;
382 UINT64 X13;
383 UINT64 X14;
384 UINT64 X15;
385 UINT64 X16;
386 UINT64 X17;
387 UINT64 X18;
388 UINT64 X19;
389 UINT64 X20;
390 UINT64 X21;
391 UINT64 X22;
392 UINT64 X23;
393 UINT64 X24;
394 UINT64 X25;
395 UINT64 X26;
396 UINT64 X27;
397 UINT64 X28;
398 UINT64 X29;
399 UINT64 X30;
400 UINT64 Sp;
Lawrence Tang4dbe3d72022-07-06 13:51:01 +0100401} EFI_ARM_V8_AARCH64_GPR;
402
403typedef struct {
John Chungf8fc7052024-05-03 20:05:29 +0800404 UINT64 Elr_El1;
405 UINT64 Esr_El1;
406 UINT64 Far_El1;
407 UINT64 Isr_El1;
408 UINT64 Mair_El1;
409 UINT64 Midr_El1;
410 UINT64 Mpidr_El1;
411 UINT64 Sctlr_El1;
412 UINT64 Sp_El0;
413 UINT64 Sp_El1;
414 UINT64 Spsr_El1;
415 UINT64 Tcr_El1;
416 UINT64 Tpidr_El0;
417 UINT64 Tpidr_El1;
418 UINT64 Tpidrro_El0;
419 UINT64 Ttbr0_El1;
420 UINT64 Ttbr1_El1;
Lawrence Tang4dbe3d72022-07-06 13:51:01 +0100421} EFI_ARM_AARCH64_EL1_CONTEXT_REGISTERS;
422
423typedef struct {
John Chungf8fc7052024-05-03 20:05:29 +0800424 UINT64 Elr_El2;
425 UINT64 Esr_El2;
426 UINT64 Far_El2;
427 UINT64 Hacr_El2;
428 UINT64 Hcr_El2;
429 UINT64 Hpfar_El2;
430 UINT64 Mair_El2;
431 UINT64 Sctlr_El2;
432 UINT64 Sp_El2;
433 UINT64 Spsr_El2;
434 UINT64 Tcr_El2;
435 UINT64 Tpidr_El2;
436 UINT64 Ttbr0_El2;
437 UINT64 Vtcr_El2;
438 UINT64 Vttbr_El2;
Lawrence Tang4dbe3d72022-07-06 13:51:01 +0100439} EFI_ARM_AARCH64_EL2_CONTEXT_REGISTERS;
440
441typedef struct {
John Chungf8fc7052024-05-03 20:05:29 +0800442 UINT64 Elr_El3;
443 UINT64 Esr_El3;
444 UINT64 Far_El3;
445 UINT64 Mair_El3;
446 UINT64 Sctlr_El3;
447 UINT64 Sp_El3;
448 UINT64 Spsr_El3;
449 UINT64 Tcr_El3;
450 UINT64 Tpidr_El3;
451 UINT64 Ttbr0_El3;
Lawrence Tang4dbe3d72022-07-06 13:51:01 +0100452} EFI_ARM_AARCH64_EL3_CONTEXT_REGISTERS;
453
454typedef struct {
John Chungf8fc7052024-05-03 20:05:29 +0800455 UINT64 MrsOp2 : 3;
456 UINT64 MrsCrm : 4;
457 UINT64 MrsCrn : 4;
458 UINT64 MrsOp1 : 3;
459 UINT64 MrsO0 : 1;
460 UINT64 Value : 64;
Lawrence Tang4dbe3d72022-07-06 13:51:01 +0100461} EFI_ARM_MISC_CONTEXT_REGISTER;
462
John Chungf8fc7052024-05-03 20:05:29 +0800463json_object *cper_section_arm_to_ir(void *section);
464void ir_section_arm_to_cper(json_object *section, FILE *out);
Lawrence Tang2800cd82022-07-05 16:08:20 +0100465
Karthik Rajagopalan255bd812024-09-06 14:36:34 -0700466#ifdef __cplusplus
467}
468#endif
469
John Chungf8fc7052024-05-03 20:05:29 +0800470#endif