1*2800cd8eSLawrence Tang /**
2*2800cd8eSLawrence Tang  * Describes functions for converting ARM CPER sections from binary and JSON format
3*2800cd8eSLawrence Tang  * into an intermediate format.
4*2800cd8eSLawrence Tang  *
5*2800cd8eSLawrence Tang  * Author: Lawrence.Tang@arm.com
6*2800cd8eSLawrence Tang  **/
7*2800cd8eSLawrence Tang 
8*2800cd8eSLawrence Tang #include <stdio.h>
9*2800cd8eSLawrence Tang #include "json.h"
10*2800cd8eSLawrence Tang #include "../edk/Cper.h"
11*2800cd8eSLawrence Tang #include "../cper-utils.h"
12*2800cd8eSLawrence Tang #include "cper-section-arm.h"
13*2800cd8eSLawrence Tang 
14*2800cd8eSLawrence Tang //Converts the given processor-generic CPER section into JSON IR.
15*2800cd8eSLawrence Tang json_object* cper_section_arm_to_ir(void* section, EFI_ERROR_SECTION_DESCRIPTOR* descriptor)
16*2800cd8eSLawrence Tang {
17*2800cd8eSLawrence Tang     EFI_ARM_PROCESSOR_ERROR_RECORD* record = (EFI_ARM_PROCESSOR_ERROR_RECORD*)section;
18*2800cd8eSLawrence Tang     json_object* section_ir = json_object_new_object();
19*2800cd8eSLawrence Tang 
20*2800cd8eSLawrence Tang     //Validation bits.
21*2800cd8eSLawrence Tang     json_object* validation = bitfield_to_ir(record->ValidFields, 4, ARM_PROCESSOR_ERROR_VALID_BITFIELD_NAMES);
22*2800cd8eSLawrence Tang     json_object_object_add(section_ir, "validationBits", validation);
23*2800cd8eSLawrence Tang 
24*2800cd8eSLawrence Tang     //Number of error info and context info structures, and length.
25*2800cd8eSLawrence Tang     json_object_object_add(section_ir, "errorInfoNum", json_object_new_int(record->ErrInfoNum));
26*2800cd8eSLawrence Tang     json_object_object_add(section_ir, "contextInfoNum", json_object_new_int(record->ContextInfoNum));
27*2800cd8eSLawrence Tang     json_object_object_add(section_ir, "sectionLength", json_object_new_int(record->SectionLength));
28*2800cd8eSLawrence Tang 
29*2800cd8eSLawrence Tang     //Error affinity.
30*2800cd8eSLawrence Tang     json_object* error_affinity = json_object_new_object();
31*2800cd8eSLawrence Tang     json_object_object_add(error_affinity, "value", json_object_new_int(record->ErrorAffinityLevel));
32*2800cd8eSLawrence Tang     json_object_object_add(error_affinity, "type",
33*2800cd8eSLawrence Tang         json_object_new_string(record->ErrorAffinityLevel < 4 ? "Vendor Defined" : "Reserved"));
34*2800cd8eSLawrence Tang     json_object_object_add(section_ir, "errorAffinity", error_affinity);
35*2800cd8eSLawrence Tang 
36*2800cd8eSLawrence Tang     //Processor ID (MPIDR_EL1) and chip ID (MIDR_EL1).
37*2800cd8eSLawrence Tang     json_object_object_add(section_ir, "mpidrEl1", json_object_new_uint64(record->MPIDR_EL1));
38*2800cd8eSLawrence Tang     json_object_object_add(section_ir, "midrEl1", json_object_new_uint64(record->MIDR_EL1));
39*2800cd8eSLawrence Tang 
40*2800cd8eSLawrence Tang     //Whether the processor is running, and the state of it if so.
41*2800cd8eSLawrence Tang     json_object_object_add(section_ir, "running", json_object_new_boolean(record->RunningState));
42*2800cd8eSLawrence Tang     if (record->RunningState)
43*2800cd8eSLawrence Tang     {
44*2800cd8eSLawrence Tang         //...
45*2800cd8eSLawrence Tang     }
46*2800cd8eSLawrence Tang 
47*2800cd8eSLawrence Tang     return section_ir;
48*2800cd8eSLawrence Tang }