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> 8*5202bbb4SLawrence 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. 14e407b4c8SLawrence Tang json_object * 15e407b4c8SLawrence Tang cper_section_platform_memory_to_ir(void *section, 16e407b4c8SLawrence Tang EFI_ERROR_SECTION_DESCRIPTOR *descriptor) 177f21db6cSLawrence Tang { 18e407b4c8SLawrence Tang EFI_PLATFORM_MEMORY_ERROR_DATA *memory_error = 19e407b4c8SLawrence Tang (EFI_PLATFORM_MEMORY_ERROR_DATA *)section; 207f21db6cSLawrence Tang json_object *section_ir = json_object_new_object(); 217f21db6cSLawrence Tang 227f21db6cSLawrence Tang //Validation bitfield. 23e407b4c8SLawrence Tang json_object *validation = 24e407b4c8SLawrence Tang bitfield_to_ir(memory_error->ValidFields, 22, 25e407b4c8SLawrence Tang MEMORY_ERROR_VALID_BITFIELD_NAMES); 267f21db6cSLawrence Tang json_object_object_add(section_ir, "validationBits", validation); 277f21db6cSLawrence Tang 287f21db6cSLawrence Tang //Error status. 29e407b4c8SLawrence Tang json_object *error_status = 30e407b4c8SLawrence Tang cper_generic_error_status_to_ir(&memory_error->ErrorStatus); 31a0865e38SLawrence Tang json_object_object_add(section_ir, "errorStatus", error_status); 32a0865e38SLawrence Tang 33a0865e38SLawrence Tang //Bank. 34a0865e38SLawrence Tang json_object *bank = json_object_new_object(); 35e407b4c8SLawrence Tang if ((memory_error->ValidFields >> 5) & 0x1) { 36583cdeeeSLawrence Tang //Entire bank address mode. 37e407b4c8SLawrence Tang json_object_object_add( 38e407b4c8SLawrence Tang bank, "value", 39e407b4c8SLawrence Tang json_object_new_uint64(memory_error->Bank)); 40e407b4c8SLawrence Tang } else { 41583cdeeeSLawrence Tang //Address/group address mode. 42e407b4c8SLawrence Tang json_object_object_add( 43e407b4c8SLawrence Tang bank, "address", 44e407b4c8SLawrence Tang json_object_new_uint64(memory_error->Bank & 0xFF)); 45e407b4c8SLawrence Tang json_object_object_add( 46e407b4c8SLawrence Tang bank, "group", 47e407b4c8SLawrence Tang json_object_new_uint64(memory_error->Bank >> 8)); 48583cdeeeSLawrence Tang } 49a0865e38SLawrence Tang json_object_object_add(section_ir, "bank", bank); 50a0865e38SLawrence Tang 51a0865e38SLawrence Tang //Memory error type. 52e407b4c8SLawrence Tang json_object *memory_error_type = integer_to_readable_pair( 53e407b4c8SLawrence Tang memory_error->ErrorType, 16, MEMORY_ERROR_TYPES_KEYS, 54e407b4c8SLawrence Tang MEMORY_ERROR_TYPES_VALUES, "Unknown (Reserved)"); 55e407b4c8SLawrence Tang json_object_object_add(section_ir, "memoryErrorType", 56e407b4c8SLawrence Tang memory_error_type); 57a0865e38SLawrence Tang 58a0865e38SLawrence Tang //"Extended" row/column indication field + misc. 59a0865e38SLawrence Tang json_object *extended = json_object_new_object(); 60e407b4c8SLawrence Tang json_object_object_add(extended, "rowBit16", 61e407b4c8SLawrence Tang json_object_new_boolean(memory_error->Extended & 62e407b4c8SLawrence Tang 0b1)); 63e407b4c8SLawrence Tang json_object_object_add( 64e407b4c8SLawrence Tang extended, "rowBit17", 65e407b4c8SLawrence Tang json_object_new_boolean((memory_error->Extended >> 1) & 0b1)); 66e407b4c8SLawrence Tang json_object_object_add(extended, "chipIdentification", 67e407b4c8SLawrence Tang json_object_new_int(memory_error->Extended >> 68e407b4c8SLawrence Tang 5)); 69a0865e38SLawrence Tang json_object_object_add(section_ir, "extended", extended); 70a0865e38SLawrence Tang 7154da4414SLawrence Tang //Miscellaneous numeric fields. 72e407b4c8SLawrence Tang json_object_object_add( 73e407b4c8SLawrence Tang section_ir, "physicalAddress", 74e407b4c8SLawrence Tang json_object_new_uint64(memory_error->PhysicalAddress)); 75e407b4c8SLawrence Tang json_object_object_add( 76e407b4c8SLawrence Tang section_ir, "physicalAddressMask", 77e407b4c8SLawrence Tang json_object_new_uint64(memory_error->PhysicalAddressMask)); 78e407b4c8SLawrence Tang json_object_object_add(section_ir, "node", 79e407b4c8SLawrence Tang json_object_new_uint64(memory_error->Node)); 80e407b4c8SLawrence Tang json_object_object_add(section_ir, "card", 81e407b4c8SLawrence Tang json_object_new_uint64(memory_error->Card)); 82e407b4c8SLawrence Tang json_object_object_add( 83e407b4c8SLawrence Tang section_ir, "moduleRank", 84e407b4c8SLawrence Tang json_object_new_uint64(memory_error->ModuleRank)); 85e407b4c8SLawrence Tang json_object_object_add(section_ir, "device", 86e407b4c8SLawrence Tang json_object_new_uint64(memory_error->Device)); 87e407b4c8SLawrence Tang json_object_object_add(section_ir, "row", 88e407b4c8SLawrence Tang json_object_new_uint64(memory_error->Row)); 89e407b4c8SLawrence Tang json_object_object_add(section_ir, "column", 90e407b4c8SLawrence Tang json_object_new_uint64(memory_error->Column)); 91e407b4c8SLawrence Tang json_object_object_add( 92e407b4c8SLawrence Tang section_ir, "bitPosition", 93e407b4c8SLawrence Tang json_object_new_uint64(memory_error->BitPosition)); 94e407b4c8SLawrence Tang json_object_object_add( 95e407b4c8SLawrence Tang section_ir, "requestorID", 96e407b4c8SLawrence Tang json_object_new_uint64(memory_error->RequestorId)); 97e407b4c8SLawrence Tang json_object_object_add( 98e407b4c8SLawrence Tang section_ir, "responderID", 99e407b4c8SLawrence Tang json_object_new_uint64(memory_error->ResponderId)); 100e407b4c8SLawrence Tang json_object_object_add(section_ir, "targetID", 101e407b4c8SLawrence Tang json_object_new_uint64(memory_error->TargetId)); 102e407b4c8SLawrence Tang json_object_object_add(section_ir, "rankNumber", 103e407b4c8SLawrence Tang json_object_new_uint64(memory_error->RankNum)); 104e407b4c8SLawrence Tang json_object_object_add( 105e407b4c8SLawrence Tang section_ir, "cardSmbiosHandle", 106e407b4c8SLawrence Tang json_object_new_uint64(memory_error->CardHandle)); 107e407b4c8SLawrence Tang json_object_object_add( 108e407b4c8SLawrence Tang section_ir, "moduleSmbiosHandle", 109e407b4c8SLawrence Tang json_object_new_uint64(memory_error->ModuleHandle)); 11054da4414SLawrence Tang 111a0865e38SLawrence Tang return section_ir; 112a0865e38SLawrence Tang } 113a0865e38SLawrence Tang 114a0865e38SLawrence Tang //Converts a single memory error 2 CPER section into JSON IR. 115e407b4c8SLawrence Tang json_object * 116e407b4c8SLawrence Tang cper_section_platform_memory2_to_ir(void *section, 117e407b4c8SLawrence Tang EFI_ERROR_SECTION_DESCRIPTOR *descriptor) 118a0865e38SLawrence Tang { 119e407b4c8SLawrence Tang EFI_PLATFORM_MEMORY2_ERROR_DATA *memory_error = 120e407b4c8SLawrence Tang (EFI_PLATFORM_MEMORY2_ERROR_DATA *)section; 121a0865e38SLawrence Tang json_object *section_ir = json_object_new_object(); 122a0865e38SLawrence Tang 12354da4414SLawrence Tang //Validation bits. 124e407b4c8SLawrence Tang json_object *validation = 125e407b4c8SLawrence Tang bitfield_to_ir(memory_error->ValidFields, 22, 126e407b4c8SLawrence Tang MEMORY_ERROR_2_VALID_BITFIELD_NAMES); 12754da4414SLawrence Tang json_object_object_add(section_ir, "validationBits", validation); 12854da4414SLawrence Tang 12954da4414SLawrence Tang //Error status. 130e407b4c8SLawrence Tang json_object *error_status = 131e407b4c8SLawrence Tang cper_generic_error_status_to_ir(&memory_error->ErrorStatus); 13254da4414SLawrence Tang json_object_object_add(section_ir, "errorStatus", error_status); 13354da4414SLawrence Tang 13454da4414SLawrence Tang //Bank. 13554da4414SLawrence Tang json_object *bank = json_object_new_object(); 136e407b4c8SLawrence Tang if ((memory_error->ValidFields >> 5) & 0x1) { 137583cdeeeSLawrence Tang //Entire bank address mode. 138e407b4c8SLawrence Tang json_object_object_add( 139e407b4c8SLawrence Tang bank, "value", 140e407b4c8SLawrence Tang json_object_new_uint64(memory_error->Bank)); 141e407b4c8SLawrence Tang } else { 142583cdeeeSLawrence Tang //Address/group address mode. 143e407b4c8SLawrence Tang json_object_object_add( 144e407b4c8SLawrence Tang bank, "address", 145e407b4c8SLawrence Tang json_object_new_uint64(memory_error->Bank & 0xFF)); 146e407b4c8SLawrence Tang json_object_object_add( 147e407b4c8SLawrence Tang bank, "group", 148e407b4c8SLawrence Tang json_object_new_uint64(memory_error->Bank >> 8)); 149583cdeeeSLawrence Tang } 15054da4414SLawrence Tang json_object_object_add(section_ir, "bank", bank); 15154da4414SLawrence Tang 15254da4414SLawrence Tang //Memory error type. 153e407b4c8SLawrence Tang json_object *memory_error_type = integer_to_readable_pair( 154e407b4c8SLawrence Tang memory_error->MemErrorType, 16, MEMORY_ERROR_TYPES_KEYS, 155e407b4c8SLawrence Tang MEMORY_ERROR_TYPES_VALUES, "Unknown (Reserved)"); 156e407b4c8SLawrence Tang json_object_object_add(section_ir, "memoryErrorType", 157e407b4c8SLawrence Tang memory_error_type); 15854da4414SLawrence Tang 15954da4414SLawrence Tang //Status. 16054da4414SLawrence Tang json_object *status = json_object_new_object(); 161e407b4c8SLawrence Tang json_object_object_add(status, "value", 162e407b4c8SLawrence Tang json_object_new_int(memory_error->Status)); 163e407b4c8SLawrence Tang json_object_object_add(status, "state", 164e407b4c8SLawrence Tang json_object_new_string(memory_error->Status & 165e407b4c8SLawrence Tang 0b1 == 0 ? 166e407b4c8SLawrence Tang "Corrected" : 167e407b4c8SLawrence Tang "Uncorrected")); 16854da4414SLawrence Tang json_object_object_add(section_ir, "status", status); 16954da4414SLawrence Tang 17054da4414SLawrence Tang //Miscellaneous numeric fields. 171e407b4c8SLawrence Tang json_object_object_add( 172e407b4c8SLawrence Tang section_ir, "physicalAddress", 173e407b4c8SLawrence Tang json_object_new_uint64(memory_error->PhysicalAddress)); 174e407b4c8SLawrence Tang json_object_object_add( 175e407b4c8SLawrence Tang section_ir, "physicalAddressMask", 176e407b4c8SLawrence Tang json_object_new_uint64(memory_error->PhysicalAddressMask)); 177e407b4c8SLawrence Tang json_object_object_add(section_ir, "node", 178e407b4c8SLawrence Tang json_object_new_uint64(memory_error->Node)); 179e407b4c8SLawrence Tang json_object_object_add(section_ir, "card", 180e407b4c8SLawrence Tang json_object_new_uint64(memory_error->Card)); 181e407b4c8SLawrence Tang json_object_object_add(section_ir, "module", 182e407b4c8SLawrence Tang json_object_new_uint64(memory_error->Module)); 183e407b4c8SLawrence Tang json_object_object_add(section_ir, "device", 184e407b4c8SLawrence Tang json_object_new_uint64(memory_error->Device)); 185e407b4c8SLawrence Tang json_object_object_add(section_ir, "row", 186e407b4c8SLawrence Tang json_object_new_uint64(memory_error->Row)); 187e407b4c8SLawrence Tang json_object_object_add(section_ir, "column", 188e407b4c8SLawrence Tang json_object_new_uint64(memory_error->Column)); 189e407b4c8SLawrence Tang json_object_object_add(section_ir, "rank", 190e407b4c8SLawrence Tang json_object_new_uint64(memory_error->Rank)); 191e407b4c8SLawrence Tang json_object_object_add( 192e407b4c8SLawrence Tang section_ir, "bitPosition", 193e407b4c8SLawrence Tang json_object_new_uint64(memory_error->BitPosition)); 194e407b4c8SLawrence Tang json_object_object_add(section_ir, "chipID", 195e407b4c8SLawrence Tang json_object_new_uint64(memory_error->ChipId)); 196e407b4c8SLawrence Tang json_object_object_add( 197e407b4c8SLawrence Tang section_ir, "requestorID", 198e407b4c8SLawrence Tang json_object_new_uint64(memory_error->RequestorId)); 199e407b4c8SLawrence Tang json_object_object_add( 200e407b4c8SLawrence Tang section_ir, "responderID", 201e407b4c8SLawrence Tang json_object_new_uint64(memory_error->ResponderId)); 202e407b4c8SLawrence Tang json_object_object_add(section_ir, "targetID", 203e407b4c8SLawrence Tang json_object_new_uint64(memory_error->TargetId)); 204e407b4c8SLawrence Tang json_object_object_add( 205e407b4c8SLawrence Tang section_ir, "cardSmbiosHandle", 206e407b4c8SLawrence Tang json_object_new_uint64(memory_error->CardHandle)); 207e407b4c8SLawrence Tang json_object_object_add( 208e407b4c8SLawrence Tang section_ir, "moduleSmbiosHandle", 209e407b4c8SLawrence Tang json_object_new_uint64(memory_error->ModuleHandle)); 210a0865e38SLawrence Tang 211a0865e38SLawrence Tang return section_ir; 2127f21db6cSLawrence Tang } 2133b7f45b5SLawrence Tang 2143b7f45b5SLawrence Tang //Converts a single Memory Error IR section into CPER binary, outputting to the provided stream. 2153b7f45b5SLawrence Tang void ir_section_memory_to_cper(json_object *section, FILE *out) 2163b7f45b5SLawrence Tang { 2173b7f45b5SLawrence Tang EFI_PLATFORM_MEMORY_ERROR_DATA *section_cper = 218e407b4c8SLawrence Tang (EFI_PLATFORM_MEMORY_ERROR_DATA *)calloc( 219e407b4c8SLawrence Tang 1, sizeof(EFI_PLATFORM_MEMORY_ERROR_DATA)); 2203b7f45b5SLawrence Tang 2213b7f45b5SLawrence Tang //Validation bits. 222e407b4c8SLawrence Tang section_cper->ValidFields = ir_to_bitfield( 223e407b4c8SLawrence Tang json_object_object_get(section, "validationBits"), 22, 224e407b4c8SLawrence Tang MEMORY_ERROR_VALID_BITFIELD_NAMES); 2253b7f45b5SLawrence Tang 2263b7f45b5SLawrence Tang //Error status. 227e407b4c8SLawrence Tang ir_generic_error_status_to_cper(json_object_object_get(section, 228e407b4c8SLawrence Tang "errorStatus"), 229e407b4c8SLawrence Tang §ion_cper->ErrorStatus); 2303b7f45b5SLawrence Tang 2313b7f45b5SLawrence Tang //Bank. 2323b7f45b5SLawrence Tang json_object *bank = json_object_object_get(section, "bank"); 233e407b4c8SLawrence Tang if ((section_cper->ValidFields >> 5) & 0x1) { 2343b7f45b5SLawrence Tang //Bank just uses simple address. 235e407b4c8SLawrence Tang section_cper->Bank = (UINT16)json_object_get_uint64( 236e407b4c8SLawrence Tang json_object_object_get(bank, "value")); 237e407b4c8SLawrence Tang } else { 2383b7f45b5SLawrence Tang //Bank uses address/group style address. 239e407b4c8SLawrence Tang UINT16 address = (UINT8)json_object_get_uint64( 240e407b4c8SLawrence Tang json_object_object_get(bank, "address")); 241e407b4c8SLawrence Tang UINT16 group = (UINT8)json_object_get_uint64( 242e407b4c8SLawrence Tang json_object_object_get(bank, "group")); 2433b7f45b5SLawrence Tang section_cper->Bank = address + (group << 8); 2443b7f45b5SLawrence Tang } 2453b7f45b5SLawrence Tang 2463b7f45b5SLawrence Tang //"Extended" field. 2473b7f45b5SLawrence Tang json_object *extended = json_object_object_get(section, "extended"); 2483b7f45b5SLawrence Tang section_cper->Extended = 0; 249e407b4c8SLawrence Tang section_cper->Extended |= json_object_get_boolean( 250e407b4c8SLawrence Tang json_object_object_get(extended, "rowBit16")); 251e407b4c8SLawrence Tang section_cper->Extended |= 252e407b4c8SLawrence Tang json_object_get_boolean( 253e407b4c8SLawrence Tang json_object_object_get(extended, "rowBit17")) 254e407b4c8SLawrence Tang << 1; 255e407b4c8SLawrence Tang section_cper->Extended |= json_object_get_int(json_object_object_get( 256e407b4c8SLawrence Tang extended, "chipIdentification")) 257e407b4c8SLawrence Tang << 5; 2583b7f45b5SLawrence Tang 2593b7f45b5SLawrence Tang //Miscellaneous value fields. 260e407b4c8SLawrence Tang section_cper->ErrorType = (UINT8)readable_pair_to_integer( 261e407b4c8SLawrence Tang json_object_object_get(section, "memoryErrorType")); 262e407b4c8SLawrence Tang section_cper->PhysicalAddress = json_object_get_uint64( 263e407b4c8SLawrence Tang json_object_object_get(section, "physicalAddress")); 264e407b4c8SLawrence Tang section_cper->PhysicalAddressMask = json_object_get_uint64( 265e407b4c8SLawrence Tang json_object_object_get(section, "physicalAddressMask")); 266e407b4c8SLawrence Tang section_cper->Node = (UINT16)json_object_get_uint64( 267e407b4c8SLawrence Tang json_object_object_get(section, "node")); 268e407b4c8SLawrence Tang section_cper->Card = (UINT16)json_object_get_uint64( 269e407b4c8SLawrence Tang json_object_object_get(section, "card")); 270e407b4c8SLawrence Tang section_cper->ModuleRank = (UINT16)json_object_get_uint64( 271e407b4c8SLawrence Tang json_object_object_get(section, "moduleRank")); 272e407b4c8SLawrence Tang section_cper->Device = (UINT16)json_object_get_uint64( 273e407b4c8SLawrence Tang json_object_object_get(section, "device")); 274e407b4c8SLawrence Tang section_cper->Row = (UINT16)json_object_get_uint64( 275e407b4c8SLawrence Tang json_object_object_get(section, "row")); 276e407b4c8SLawrence Tang section_cper->Column = (UINT16)json_object_get_uint64( 277e407b4c8SLawrence Tang json_object_object_get(section, "column")); 278e407b4c8SLawrence Tang section_cper->BitPosition = (UINT16)json_object_get_uint64( 279e407b4c8SLawrence Tang json_object_object_get(section, "bitPosition")); 280e407b4c8SLawrence Tang section_cper->RequestorId = json_object_get_uint64( 281e407b4c8SLawrence Tang json_object_object_get(section, "requestorID")); 282e407b4c8SLawrence Tang section_cper->ResponderId = json_object_get_uint64( 283e407b4c8SLawrence Tang json_object_object_get(section, "responderID")); 284e407b4c8SLawrence Tang section_cper->TargetId = json_object_get_uint64( 285e407b4c8SLawrence Tang json_object_object_get(section, "targetID")); 286e407b4c8SLawrence Tang section_cper->RankNum = (UINT16)json_object_get_uint64( 287e407b4c8SLawrence Tang json_object_object_get(section, "rankNumber")); 288e407b4c8SLawrence Tang section_cper->CardHandle = (UINT16)json_object_get_uint64( 289e407b4c8SLawrence Tang json_object_object_get(section, "cardSmbiosHandle")); 290e407b4c8SLawrence Tang section_cper->ModuleHandle = (UINT16)json_object_get_uint64( 291e407b4c8SLawrence Tang json_object_object_get(section, "moduleSmbiosHandle")); 2923b7f45b5SLawrence Tang 2933b7f45b5SLawrence Tang //Write to stream, free up resources. 2943ab351feSLawrence Tang fwrite(section_cper, sizeof(EFI_PLATFORM_MEMORY_ERROR_DATA), 1, out); 2953b7f45b5SLawrence Tang fflush(out); 2963b7f45b5SLawrence Tang free(section_cper); 2973b7f45b5SLawrence Tang } 2983b7f45b5SLawrence Tang 2993b7f45b5SLawrence Tang //Converts a single Memory Error 2 IR section into CPER binary, outputting to the provided stream. 3003b7f45b5SLawrence Tang void ir_section_memory2_to_cper(json_object *section, FILE *out) 3013b7f45b5SLawrence Tang { 3023b7f45b5SLawrence Tang EFI_PLATFORM_MEMORY2_ERROR_DATA *section_cper = 303e407b4c8SLawrence Tang (EFI_PLATFORM_MEMORY2_ERROR_DATA *)calloc( 304e407b4c8SLawrence Tang 1, sizeof(EFI_PLATFORM_MEMORY2_ERROR_DATA)); 3053b7f45b5SLawrence Tang 3063b7f45b5SLawrence Tang //Validation bits. 307e407b4c8SLawrence Tang section_cper->ValidFields = ir_to_bitfield( 308e407b4c8SLawrence Tang json_object_object_get(section, "validationBits"), 22, 309e407b4c8SLawrence Tang MEMORY_ERROR_2_VALID_BITFIELD_NAMES); 3103b7f45b5SLawrence Tang 3113b7f45b5SLawrence Tang //Error status. 312e407b4c8SLawrence Tang ir_generic_error_status_to_cper(json_object_object_get(section, 313e407b4c8SLawrence Tang "errorStatus"), 314e407b4c8SLawrence Tang §ion_cper->ErrorStatus); 3153b7f45b5SLawrence Tang 3163b7f45b5SLawrence Tang //Bank. 3173b7f45b5SLawrence Tang json_object *bank = json_object_object_get(section, "bank"); 318e407b4c8SLawrence Tang if ((section_cper->ValidFields >> 5) & 0x1) { 3193b7f45b5SLawrence Tang //Bank just uses simple address. 320e407b4c8SLawrence Tang section_cper->Bank = (UINT16)json_object_get_uint64( 321e407b4c8SLawrence Tang json_object_object_get(bank, "value")); 322e407b4c8SLawrence Tang } else { 3233b7f45b5SLawrence Tang //Bank uses address/group style address. 324e407b4c8SLawrence Tang UINT16 address = (UINT8)json_object_get_uint64( 325e407b4c8SLawrence Tang json_object_object_get(bank, "address")); 326e407b4c8SLawrence Tang UINT16 group = (UINT8)json_object_get_uint64( 327e407b4c8SLawrence Tang json_object_object_get(bank, "group")); 3283b7f45b5SLawrence Tang section_cper->Bank = address + (group << 8); 3293b7f45b5SLawrence Tang } 3303b7f45b5SLawrence Tang 3313b7f45b5SLawrence Tang //Miscellaneous value fields. 332e407b4c8SLawrence Tang section_cper->MemErrorType = readable_pair_to_integer( 333e407b4c8SLawrence Tang json_object_object_get(section, "memoryErrorType")); 334e407b4c8SLawrence Tang section_cper->Status = (UINT8)readable_pair_to_integer( 335e407b4c8SLawrence Tang json_object_object_get(section, "status")); 336e407b4c8SLawrence Tang section_cper->PhysicalAddress = json_object_get_uint64( 337e407b4c8SLawrence Tang json_object_object_get(section, "physicalAddress")); 338e407b4c8SLawrence Tang section_cper->PhysicalAddressMask = json_object_get_uint64( 339e407b4c8SLawrence Tang json_object_object_get(section, "physicalAddressMask")); 340e407b4c8SLawrence Tang section_cper->Node = (UINT16)json_object_get_uint64( 341e407b4c8SLawrence Tang json_object_object_get(section, "node")); 342e407b4c8SLawrence Tang section_cper->Card = (UINT16)json_object_get_uint64( 343e407b4c8SLawrence Tang json_object_object_get(section, "card")); 344e407b4c8SLawrence Tang section_cper->Module = (UINT32)json_object_get_uint64( 345e407b4c8SLawrence Tang json_object_object_get(section, "module")); 346e407b4c8SLawrence Tang section_cper->Device = (UINT32)json_object_get_uint64( 347e407b4c8SLawrence Tang json_object_object_get(section, "device")); 348e407b4c8SLawrence Tang section_cper->Row = (UINT32)json_object_get_uint64( 349e407b4c8SLawrence Tang json_object_object_get(section, "row")); 350e407b4c8SLawrence Tang section_cper->Column = (UINT32)json_object_get_uint64( 351e407b4c8SLawrence Tang json_object_object_get(section, "column")); 352e407b4c8SLawrence Tang section_cper->Rank = (UINT32)json_object_get_uint64( 353e407b4c8SLawrence Tang json_object_object_get(section, "rank")); 354e407b4c8SLawrence Tang section_cper->BitPosition = (UINT32)json_object_get_uint64( 355e407b4c8SLawrence Tang json_object_object_get(section, "bitPosition")); 356e407b4c8SLawrence Tang section_cper->ChipId = (UINT8)json_object_get_uint64( 357e407b4c8SLawrence Tang json_object_object_get(section, "chipID")); 358e407b4c8SLawrence Tang section_cper->RequestorId = json_object_get_uint64( 359e407b4c8SLawrence Tang json_object_object_get(section, "requestorID")); 360e407b4c8SLawrence Tang section_cper->ResponderId = json_object_get_uint64( 361e407b4c8SLawrence Tang json_object_object_get(section, "responderID")); 362e407b4c8SLawrence Tang section_cper->TargetId = json_object_get_uint64( 363e407b4c8SLawrence Tang json_object_object_get(section, "targetID")); 364e407b4c8SLawrence Tang section_cper->CardHandle = (UINT32)json_object_get_uint64( 365e407b4c8SLawrence Tang json_object_object_get(section, "cardSmbiosHandle")); 366e407b4c8SLawrence Tang section_cper->ModuleHandle = (UINT32)json_object_get_uint64( 367e407b4c8SLawrence Tang json_object_object_get(section, "moduleSmbiosHandle")); 3683b7f45b5SLawrence Tang 3693b7f45b5SLawrence Tang //Write to stream, free up resources. 3703ab351feSLawrence Tang fwrite(section_cper, sizeof(EFI_PLATFORM_MEMORY2_ERROR_DATA), 1, out); 3713b7f45b5SLawrence Tang fflush(out); 3723b7f45b5SLawrence Tang free(section_cper); 3733b7f45b5SLawrence Tang }