17f21db6cSLawrence Tang /** 27f21db6cSLawrence Tang * Describes functions for converting memory error CPER sections from binary and JSON format 37f21db6cSLawrence Tang * into an intermediate format. 47f21db6cSLawrence Tang * 57f21db6cSLawrence Tang * Author: Lawrence.Tang@arm.com 67f21db6cSLawrence Tang **/ 77f21db6cSLawrence Tang #include <stdio.h> 87f21db6cSLawrence Tang #include "json.h" 97f21db6cSLawrence Tang #include "../edk/Cper.h" 107f21db6cSLawrence Tang #include "../cper-utils.h" 117f21db6cSLawrence Tang #include "cper-section-memory.h" 127f21db6cSLawrence Tang 137f21db6cSLawrence Tang //Converts a single memory error CPER section into JSON IR. 14a0865e38SLawrence Tang json_object* cper_section_platform_memory_to_ir(void* section, EFI_ERROR_SECTION_DESCRIPTOR* descriptor) 157f21db6cSLawrence Tang { 167f21db6cSLawrence Tang EFI_PLATFORM_MEMORY_ERROR_DATA* memory_error = (EFI_PLATFORM_MEMORY_ERROR_DATA*)section; 177f21db6cSLawrence Tang json_object* section_ir = json_object_new_object(); 187f21db6cSLawrence Tang 197f21db6cSLawrence Tang //Validation bitfield. 207f21db6cSLawrence Tang json_object* validation = bitfield_to_ir(memory_error->ValidFields, 22, MEMORY_ERROR_VALID_BITFIELD_NAMES); 217f21db6cSLawrence Tang json_object_object_add(section_ir, "validationBits", validation); 227f21db6cSLawrence Tang 237f21db6cSLawrence Tang //Error status. 24a0865e38SLawrence Tang json_object* error_status = cper_generic_error_status_to_ir(&memory_error->ErrorStatus); 25a0865e38SLawrence Tang json_object_object_add(section_ir, "errorStatus", error_status); 26a0865e38SLawrence Tang 27a0865e38SLawrence Tang //Bank. 28a0865e38SLawrence Tang json_object* bank = json_object_new_object(); 29a0865e38SLawrence Tang json_object_object_add(bank, "address", json_object_new_uint64(memory_error->Bank & 0xFF)); 30a0865e38SLawrence Tang json_object_object_add(bank, "group", json_object_new_uint64(memory_error->Bank >> 8)); 31a0865e38SLawrence Tang json_object_object_add(section_ir, "bank", bank); 32a0865e38SLawrence Tang 33a0865e38SLawrence Tang //Memory error type. 34a0865e38SLawrence Tang json_object* memory_error_type = integer_to_readable_pair(memory_error->ErrorType, 16, 35a0865e38SLawrence Tang MEMORY_ERROR_TYPES_KEYS, 36a0865e38SLawrence Tang MEMORY_ERROR_TYPES_VALUES, 37a0865e38SLawrence Tang "Unknown (Reserved)"); 38a0865e38SLawrence Tang json_object_object_add(section_ir, "memoryErrorType", memory_error_type); 39a0865e38SLawrence Tang 40a0865e38SLawrence Tang //"Extended" row/column indication field + misc. 41a0865e38SLawrence Tang json_object* extended = json_object_new_object(); 42a0865e38SLawrence Tang json_object_object_add(extended, "rowBit16", json_object_new_boolean(memory_error->Extended & 0b1)); 43a0865e38SLawrence Tang json_object_object_add(extended, "rowBit17", json_object_new_boolean((memory_error->Extended >> 1) & 0b1)); 44a0865e38SLawrence Tang json_object_object_add(extended, "chipIdentification", json_object_new_int(memory_error->Extended >> 5)); 45a0865e38SLawrence Tang json_object_object_add(section_ir, "extended", extended); 46a0865e38SLawrence Tang 47*54da4414SLawrence Tang //Miscellaneous numeric fields. 48*54da4414SLawrence Tang json_object_object_add(section_ir, "physicalAddress", json_object_new_uint64(memory_error->PhysicalAddress)); 49*54da4414SLawrence Tang json_object_object_add(section_ir, "physicalAddressMask", json_object_new_uint64(memory_error->PhysicalAddressMask)); 50*54da4414SLawrence Tang json_object_object_add(section_ir, "node", json_object_new_uint64(memory_error->Node)); 51*54da4414SLawrence Tang json_object_object_add(section_ir, "card", json_object_new_uint64(memory_error->Card)); 52*54da4414SLawrence Tang json_object_object_add(section_ir, "moduleRank", json_object_new_uint64(memory_error->ModuleRank)); 53*54da4414SLawrence Tang json_object_object_add(section_ir, "device", json_object_new_uint64(memory_error->Device)); 54*54da4414SLawrence Tang json_object_object_add(section_ir, "row", json_object_new_uint64(memory_error->Row)); 55*54da4414SLawrence Tang json_object_object_add(section_ir, "column", json_object_new_uint64(memory_error->Column)); 56*54da4414SLawrence Tang json_object_object_add(section_ir, "bitPosition", json_object_new_uint64(memory_error->BitPosition)); 57*54da4414SLawrence Tang json_object_object_add(section_ir, "requestorID", json_object_new_uint64(memory_error->RequestorId)); 58*54da4414SLawrence Tang json_object_object_add(section_ir, "responderID", json_object_new_uint64(memory_error->ResponderId)); 59*54da4414SLawrence Tang json_object_object_add(section_ir, "targetID", json_object_new_uint64(memory_error->TargetId)); 60*54da4414SLawrence Tang json_object_object_add(section_ir, "rankNumber", json_object_new_uint64(memory_error->RankNum)); 61*54da4414SLawrence Tang json_object_object_add(section_ir, "cardSmbiosHandle", json_object_new_uint64(memory_error->CardHandle)); 62*54da4414SLawrence Tang json_object_object_add(section_ir, "moduleSmbiosHandle", json_object_new_uint64(memory_error->ModuleHandle)); 63*54da4414SLawrence Tang 64a0865e38SLawrence Tang return section_ir; 65a0865e38SLawrence Tang } 66a0865e38SLawrence Tang 67a0865e38SLawrence Tang //Converts a single memory error 2 CPER section into JSON IR. 68a0865e38SLawrence Tang json_object* cper_section_platform_memory2_to_ir(void* section, EFI_ERROR_SECTION_DESCRIPTOR* descriptor) 69a0865e38SLawrence Tang { 70a0865e38SLawrence Tang EFI_PLATFORM_MEMORY2_ERROR_DATA* memory_error = (EFI_PLATFORM_MEMORY2_ERROR_DATA*)section; 71a0865e38SLawrence Tang json_object* section_ir = json_object_new_object(); 72a0865e38SLawrence Tang 73*54da4414SLawrence Tang //Validation bits. 74*54da4414SLawrence Tang json_object* validation = bitfield_to_ir(memory_error->ValidFields, 22, MEMORY_ERROR_2_VALID_BITFIELD_NAMES); 75*54da4414SLawrence Tang json_object_object_add(section_ir, "validationBits", validation); 76*54da4414SLawrence Tang 77*54da4414SLawrence Tang //Error status. 78*54da4414SLawrence Tang json_object* error_status = cper_generic_error_status_to_ir(&memory_error->ErrorStatus); 79*54da4414SLawrence Tang json_object_object_add(section_ir, "errorStatus", error_status); 80*54da4414SLawrence Tang 81*54da4414SLawrence Tang //Bank. 82*54da4414SLawrence Tang json_object* bank = json_object_new_object(); 83*54da4414SLawrence Tang json_object_object_add(bank, "address", json_object_new_uint64(memory_error->Bank & 0xFF)); 84*54da4414SLawrence Tang json_object_object_add(bank, "group", json_object_new_uint64(memory_error->Bank >> 8)); 85*54da4414SLawrence Tang json_object_object_add(section_ir, "bank", bank); 86*54da4414SLawrence Tang 87*54da4414SLawrence Tang //Memory error type. 88*54da4414SLawrence Tang json_object* memory_error_type = integer_to_readable_pair(memory_error->MemErrorType, 16, 89*54da4414SLawrence Tang MEMORY_ERROR_TYPES_KEYS, 90*54da4414SLawrence Tang MEMORY_ERROR_TYPES_VALUES, 91*54da4414SLawrence Tang "Unknown (Reserved)"); 92*54da4414SLawrence Tang json_object_object_add(section_ir, "memoryErrorType", memory_error_type); 93*54da4414SLawrence Tang 94*54da4414SLawrence Tang //Status. 95*54da4414SLawrence Tang json_object* status = json_object_new_object(); 96*54da4414SLawrence Tang json_object_object_add(status, "value", json_object_new_int(memory_error->Status)); 97*54da4414SLawrence Tang json_object_object_add(status, "state", json_object_new_string(memory_error->Status & 0b1 == 0 ? "Corrected" : "Uncorrected")); 98*54da4414SLawrence Tang json_object_object_add(section_ir, "status", status); 99*54da4414SLawrence Tang 100*54da4414SLawrence Tang //Miscellaneous numeric fields. 101*54da4414SLawrence Tang json_object_object_add(section_ir, "physicalAddress", json_object_new_uint64(memory_error->PhysicalAddress)); 102*54da4414SLawrence Tang json_object_object_add(section_ir, "physicalAddressMask", json_object_new_uint64(memory_error->PhysicalAddressMask)); 103*54da4414SLawrence Tang json_object_object_add(section_ir, "node", json_object_new_uint64(memory_error->Node)); 104*54da4414SLawrence Tang json_object_object_add(section_ir, "card", json_object_new_uint64(memory_error->Card)); 105*54da4414SLawrence Tang json_object_object_add(section_ir, "module", json_object_new_uint64(memory_error->Module)); 106*54da4414SLawrence Tang json_object_object_add(section_ir, "device", json_object_new_uint64(memory_error->Device)); 107*54da4414SLawrence Tang json_object_object_add(section_ir, "row", json_object_new_uint64(memory_error->Row)); 108*54da4414SLawrence Tang json_object_object_add(section_ir, "column", json_object_new_uint64(memory_error->Column)); 109*54da4414SLawrence Tang json_object_object_add(section_ir, "rank", json_object_new_uint64(memory_error->Rank)); 110*54da4414SLawrence Tang json_object_object_add(section_ir, "bitPosition", json_object_new_uint64(memory_error->BitPosition)); 111*54da4414SLawrence Tang json_object_object_add(section_ir, "chipID", json_object_new_uint64(memory_error->ChipId)); 112*54da4414SLawrence Tang json_object_object_add(section_ir, "requestorID", json_object_new_uint64(memory_error->RequestorId)); 113*54da4414SLawrence Tang json_object_object_add(section_ir, "responderID", json_object_new_uint64(memory_error->ResponderId)); 114*54da4414SLawrence Tang json_object_object_add(section_ir, "targetID", json_object_new_uint64(memory_error->TargetId)); 115*54da4414SLawrence Tang json_object_object_add(section_ir, "cardSmbiosHandle", json_object_new_uint64(memory_error->CardHandle)); 116*54da4414SLawrence Tang json_object_object_add(section_ir, "moduleSmbiosHandle", json_object_new_uint64(memory_error->ModuleHandle)); 117a0865e38SLawrence Tang 118a0865e38SLawrence Tang return section_ir; 1197f21db6cSLawrence Tang }