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 }