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 }