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(); 29*583cdeeeSLawrence Tang if ((memory_error->ValidFields >> 5) & 0x1) 30*583cdeeeSLawrence Tang { 31*583cdeeeSLawrence Tang //Entire bank address mode. 32*583cdeeeSLawrence Tang json_object_object_add(bank, "value", json_object_new_uint64(memory_error->Bank)); 33*583cdeeeSLawrence Tang } 34*583cdeeeSLawrence Tang else 35*583cdeeeSLawrence Tang { 36*583cdeeeSLawrence Tang //Address/group address mode. 37a0865e38SLawrence Tang json_object_object_add(bank, "address", json_object_new_uint64(memory_error->Bank & 0xFF)); 38a0865e38SLawrence Tang json_object_object_add(bank, "group", json_object_new_uint64(memory_error->Bank >> 8)); 39*583cdeeeSLawrence Tang } 40a0865e38SLawrence Tang json_object_object_add(section_ir, "bank", bank); 41a0865e38SLawrence Tang 42a0865e38SLawrence Tang //Memory error type. 43a0865e38SLawrence Tang json_object* memory_error_type = integer_to_readable_pair(memory_error->ErrorType, 16, 44a0865e38SLawrence Tang MEMORY_ERROR_TYPES_KEYS, 45a0865e38SLawrence Tang MEMORY_ERROR_TYPES_VALUES, 46a0865e38SLawrence Tang "Unknown (Reserved)"); 47a0865e38SLawrence Tang json_object_object_add(section_ir, "memoryErrorType", memory_error_type); 48a0865e38SLawrence Tang 49a0865e38SLawrence Tang //"Extended" row/column indication field + misc. 50a0865e38SLawrence Tang json_object* extended = json_object_new_object(); 51a0865e38SLawrence Tang json_object_object_add(extended, "rowBit16", json_object_new_boolean(memory_error->Extended & 0b1)); 52a0865e38SLawrence Tang json_object_object_add(extended, "rowBit17", json_object_new_boolean((memory_error->Extended >> 1) & 0b1)); 53a0865e38SLawrence Tang json_object_object_add(extended, "chipIdentification", json_object_new_int(memory_error->Extended >> 5)); 54a0865e38SLawrence Tang json_object_object_add(section_ir, "extended", extended); 55a0865e38SLawrence Tang 5654da4414SLawrence Tang //Miscellaneous numeric fields. 5754da4414SLawrence Tang json_object_object_add(section_ir, "physicalAddress", json_object_new_uint64(memory_error->PhysicalAddress)); 5854da4414SLawrence Tang json_object_object_add(section_ir, "physicalAddressMask", json_object_new_uint64(memory_error->PhysicalAddressMask)); 5954da4414SLawrence Tang json_object_object_add(section_ir, "node", json_object_new_uint64(memory_error->Node)); 6054da4414SLawrence Tang json_object_object_add(section_ir, "card", json_object_new_uint64(memory_error->Card)); 6154da4414SLawrence Tang json_object_object_add(section_ir, "moduleRank", json_object_new_uint64(memory_error->ModuleRank)); 6254da4414SLawrence Tang json_object_object_add(section_ir, "device", json_object_new_uint64(memory_error->Device)); 6354da4414SLawrence Tang json_object_object_add(section_ir, "row", json_object_new_uint64(memory_error->Row)); 6454da4414SLawrence Tang json_object_object_add(section_ir, "column", json_object_new_uint64(memory_error->Column)); 6554da4414SLawrence Tang json_object_object_add(section_ir, "bitPosition", json_object_new_uint64(memory_error->BitPosition)); 6654da4414SLawrence Tang json_object_object_add(section_ir, "requestorID", json_object_new_uint64(memory_error->RequestorId)); 6754da4414SLawrence Tang json_object_object_add(section_ir, "responderID", json_object_new_uint64(memory_error->ResponderId)); 6854da4414SLawrence Tang json_object_object_add(section_ir, "targetID", json_object_new_uint64(memory_error->TargetId)); 6954da4414SLawrence Tang json_object_object_add(section_ir, "rankNumber", json_object_new_uint64(memory_error->RankNum)); 7054da4414SLawrence Tang json_object_object_add(section_ir, "cardSmbiosHandle", json_object_new_uint64(memory_error->CardHandle)); 7154da4414SLawrence Tang json_object_object_add(section_ir, "moduleSmbiosHandle", json_object_new_uint64(memory_error->ModuleHandle)); 7254da4414SLawrence Tang 73a0865e38SLawrence Tang return section_ir; 74a0865e38SLawrence Tang } 75a0865e38SLawrence Tang 76a0865e38SLawrence Tang //Converts a single memory error 2 CPER section into JSON IR. 77a0865e38SLawrence Tang json_object* cper_section_platform_memory2_to_ir(void* section, EFI_ERROR_SECTION_DESCRIPTOR* descriptor) 78a0865e38SLawrence Tang { 79a0865e38SLawrence Tang EFI_PLATFORM_MEMORY2_ERROR_DATA* memory_error = (EFI_PLATFORM_MEMORY2_ERROR_DATA*)section; 80a0865e38SLawrence Tang json_object* section_ir = json_object_new_object(); 81a0865e38SLawrence Tang 8254da4414SLawrence Tang //Validation bits. 8354da4414SLawrence Tang json_object* validation = bitfield_to_ir(memory_error->ValidFields, 22, MEMORY_ERROR_2_VALID_BITFIELD_NAMES); 8454da4414SLawrence Tang json_object_object_add(section_ir, "validationBits", validation); 8554da4414SLawrence Tang 8654da4414SLawrence Tang //Error status. 8754da4414SLawrence Tang json_object* error_status = cper_generic_error_status_to_ir(&memory_error->ErrorStatus); 8854da4414SLawrence Tang json_object_object_add(section_ir, "errorStatus", error_status); 8954da4414SLawrence Tang 9054da4414SLawrence Tang //Bank. 9154da4414SLawrence Tang json_object* bank = json_object_new_object(); 92*583cdeeeSLawrence Tang if ((memory_error->ValidFields >> 5) & 0x1) 93*583cdeeeSLawrence Tang { 94*583cdeeeSLawrence Tang //Entire bank address mode. 95*583cdeeeSLawrence Tang json_object_object_add(bank, "value", json_object_new_uint64(memory_error->Bank)); 96*583cdeeeSLawrence Tang } 97*583cdeeeSLawrence Tang else 98*583cdeeeSLawrence Tang { 99*583cdeeeSLawrence Tang //Address/group address mode. 10054da4414SLawrence Tang json_object_object_add(bank, "address", json_object_new_uint64(memory_error->Bank & 0xFF)); 10154da4414SLawrence Tang json_object_object_add(bank, "group", json_object_new_uint64(memory_error->Bank >> 8)); 102*583cdeeeSLawrence Tang } 10354da4414SLawrence Tang json_object_object_add(section_ir, "bank", bank); 10454da4414SLawrence Tang 10554da4414SLawrence Tang //Memory error type. 10654da4414SLawrence Tang json_object* memory_error_type = integer_to_readable_pair(memory_error->MemErrorType, 16, 10754da4414SLawrence Tang MEMORY_ERROR_TYPES_KEYS, 10854da4414SLawrence Tang MEMORY_ERROR_TYPES_VALUES, 10954da4414SLawrence Tang "Unknown (Reserved)"); 11054da4414SLawrence Tang json_object_object_add(section_ir, "memoryErrorType", memory_error_type); 11154da4414SLawrence Tang 11254da4414SLawrence Tang //Status. 11354da4414SLawrence Tang json_object* status = json_object_new_object(); 11454da4414SLawrence Tang json_object_object_add(status, "value", json_object_new_int(memory_error->Status)); 11554da4414SLawrence Tang json_object_object_add(status, "state", json_object_new_string(memory_error->Status & 0b1 == 0 ? "Corrected" : "Uncorrected")); 11654da4414SLawrence Tang json_object_object_add(section_ir, "status", status); 11754da4414SLawrence Tang 11854da4414SLawrence Tang //Miscellaneous numeric fields. 11954da4414SLawrence Tang json_object_object_add(section_ir, "physicalAddress", json_object_new_uint64(memory_error->PhysicalAddress)); 12054da4414SLawrence Tang json_object_object_add(section_ir, "physicalAddressMask", json_object_new_uint64(memory_error->PhysicalAddressMask)); 12154da4414SLawrence Tang json_object_object_add(section_ir, "node", json_object_new_uint64(memory_error->Node)); 12254da4414SLawrence Tang json_object_object_add(section_ir, "card", json_object_new_uint64(memory_error->Card)); 12354da4414SLawrence Tang json_object_object_add(section_ir, "module", json_object_new_uint64(memory_error->Module)); 12454da4414SLawrence Tang json_object_object_add(section_ir, "device", json_object_new_uint64(memory_error->Device)); 12554da4414SLawrence Tang json_object_object_add(section_ir, "row", json_object_new_uint64(memory_error->Row)); 12654da4414SLawrence Tang json_object_object_add(section_ir, "column", json_object_new_uint64(memory_error->Column)); 12754da4414SLawrence Tang json_object_object_add(section_ir, "rank", json_object_new_uint64(memory_error->Rank)); 12854da4414SLawrence Tang json_object_object_add(section_ir, "bitPosition", json_object_new_uint64(memory_error->BitPosition)); 12954da4414SLawrence Tang json_object_object_add(section_ir, "chipID", json_object_new_uint64(memory_error->ChipId)); 13054da4414SLawrence Tang json_object_object_add(section_ir, "requestorID", json_object_new_uint64(memory_error->RequestorId)); 13154da4414SLawrence Tang json_object_object_add(section_ir, "responderID", json_object_new_uint64(memory_error->ResponderId)); 13254da4414SLawrence Tang json_object_object_add(section_ir, "targetID", json_object_new_uint64(memory_error->TargetId)); 13354da4414SLawrence Tang json_object_object_add(section_ir, "cardSmbiosHandle", json_object_new_uint64(memory_error->CardHandle)); 13454da4414SLawrence Tang json_object_object_add(section_ir, "moduleSmbiosHandle", json_object_new_uint64(memory_error->ModuleHandle)); 135a0865e38SLawrence Tang 136a0865e38SLawrence Tang return section_ir; 1377f21db6cSLawrence Tang }