11b0b00e3SLawrence Tang /** 21b0b00e3SLawrence Tang * Describes functions for converting processor-generic CPER sections from binary and JSON format 31b0b00e3SLawrence Tang * into an intermediate format. 41b0b00e3SLawrence Tang * 51b0b00e3SLawrence Tang * Author: Lawrence.Tang@arm.com 61b0b00e3SLawrence Tang **/ 71b0b00e3SLawrence Tang 81b0b00e3SLawrence Tang #include <stdio.h> 91b0b00e3SLawrence Tang #include "json.h" 101b0b00e3SLawrence Tang #include "../edk/Cper.h" 111b0b00e3SLawrence Tang #include "../cper-utils.h" 123c43f743SLawrence Tang #include "cper-section-generic.h" 131b0b00e3SLawrence Tang 141b0b00e3SLawrence Tang //Converts the given processor-generic CPER section into JSON IR. 151b0b00e3SLawrence Tang json_object* cper_section_generic_to_ir(void* section, EFI_ERROR_SECTION_DESCRIPTOR* descriptor) 161b0b00e3SLawrence Tang { 173c43f743SLawrence Tang EFI_PROCESSOR_GENERIC_ERROR_DATA* section_generic = (EFI_PROCESSOR_GENERIC_ERROR_DATA*)section; 183c43f743SLawrence Tang json_object* section_ir = json_object_new_object(); 193c43f743SLawrence Tang 203c43f743SLawrence Tang //Validation bits. 21*22a467ceSLawrence Tang json_object* validation = bitfield_to_ir(section_generic->ValidFields, 13, GENERIC_VALIDATION_BITFIELD_NAMES); 223c43f743SLawrence Tang json_object_object_add(section_ir, "validationBits", validation); 233c43f743SLawrence Tang 243c43f743SLawrence Tang //Processor type, with human readable name if possible. 253c43f743SLawrence Tang json_object* processor_type = integer_to_readable_pair(section_generic->Type, 263c43f743SLawrence Tang sizeof(GENERIC_PROC_TYPES_KEYS) / sizeof(int), 273c43f743SLawrence Tang GENERIC_PROC_TYPES_KEYS, 283c43f743SLawrence Tang GENERIC_PROC_TYPES_VALUES, 293c43f743SLawrence Tang "Unknown (Reserved)"); 303c43f743SLawrence Tang json_object_object_add(section_ir, "processorType", processor_type); 313c43f743SLawrence Tang 323c43f743SLawrence Tang //Processor ISA, with human readable name if possible. 333c43f743SLawrence Tang json_object* processor_isa = integer_to_readable_pair(section_generic->Isa, 343c43f743SLawrence Tang sizeof(GENERIC_ISA_TYPES_KEYS) / sizeof(int), 353c43f743SLawrence Tang GENERIC_ISA_TYPES_KEYS, 363c43f743SLawrence Tang GENERIC_ISA_TYPES_VALUES, 373c43f743SLawrence Tang "Unknown (Reserved"); 383c43f743SLawrence Tang json_object_object_add(section_ir, "processorISA", processor_isa); 393c43f743SLawrence Tang 403c43f743SLawrence Tang //Processor error type, with human readable name if possible. 413c43f743SLawrence Tang json_object* processor_error_type = integer_to_readable_pair(section_generic->ErrorType, 423c43f743SLawrence Tang sizeof(GENERIC_ERROR_TYPES_KEYS) / sizeof(int), 433c43f743SLawrence Tang GENERIC_ERROR_TYPES_KEYS, 443c43f743SLawrence Tang GENERIC_ERROR_TYPES_VALUES, 453c43f743SLawrence Tang "Unknown (Reserved"); 463c43f743SLawrence Tang json_object_object_add(section_ir, "errorType", processor_error_type); 473c43f743SLawrence Tang 483c43f743SLawrence Tang //The operation performed, with a human readable name if possible. 493c43f743SLawrence Tang json_object* operation = integer_to_readable_pair(section_generic->Operation, 503c43f743SLawrence Tang sizeof(GENERIC_OPERATION_TYPES_KEYS) / sizeof(int), 513c43f743SLawrence Tang GENERIC_OPERATION_TYPES_KEYS, 523c43f743SLawrence Tang GENERIC_OPERATION_TYPES_VALUES, 533c43f743SLawrence Tang "Unknown (Reserved"); 543c43f743SLawrence Tang json_object_object_add(section_ir, "operation", operation); 553c43f743SLawrence Tang 563c43f743SLawrence Tang //Flags, additional information about the error. 57*22a467ceSLawrence Tang json_object* flags = bitfield_to_ir(section_generic->Flags, 4, GENERIC_FLAGS_BITFIELD_NAMES); 583c43f743SLawrence Tang json_object_object_add(section_ir, "flags", flags); 593c43f743SLawrence Tang 603c43f743SLawrence Tang //The level of the error. 613c43f743SLawrence Tang json_object_object_add(section_ir, "level", json_object_new_int(section_generic->Level)); 623c43f743SLawrence Tang 633c43f743SLawrence Tang //CPU version information (todo) 643c43f743SLawrence Tang //... 653c43f743SLawrence Tang 663c43f743SLawrence Tang //CPU brand string. May not exist if on ARM. 673c43f743SLawrence Tang json_object_object_add(section_ir, "cpuBrandString", json_object_new_string(section_generic->BrandString)); 683c43f743SLawrence Tang 693c43f743SLawrence Tang //Remaining 64-bit fields. 703c43f743SLawrence Tang json_object_object_add(section_ir, "processorID", json_object_new_uint64(section_generic->ApicId)); 713c43f743SLawrence Tang json_object_object_add(section_ir, "targetAddress", json_object_new_uint64(section_generic->TargetAddr)); 723c43f743SLawrence Tang json_object_object_add(section_ir, "requestorID", json_object_new_uint64(section_generic->RequestorId)); 733c43f743SLawrence Tang json_object_object_add(section_ir, "responderID", json_object_new_uint64(section_generic->ResponderId)); 743c43f743SLawrence Tang json_object_object_add(section_ir, "instructionIP", json_object_new_uint64(section_generic->InstructionIP)); 753c43f743SLawrence Tang 763c43f743SLawrence Tang return section_ir; 771b0b00e3SLawrence Tang }