xref: /openbmc/libcper/sections/cper-section-ipf.c (revision 50b966f7afa31fe39fda70e10eb9139cce39e025)
1 /**
2  * Describes functions for converting Intel IPF CPER sections from binary and JSON format
3  * into an intermediate format.
4  *
5  * Author: Lawrence.Tang@arm.com
6  **/
7 #include <stdio.h>
8 #include <json.h>
9 #include <libcper/Cper.h>
10 #include <libcper/cper-utils.h>
11 #include <libcper/sections/cper-section-ipf.h>
12 #include <libcper/log.h>
13 
14 json_object *cper_ipf_mod_error_read_array(EFI_IPF_MOD_ERROR_INFO **cur_error,
15 					   int num_to_read);
16 json_object *cper_ipf_mod_error_to_ir(EFI_IPF_MOD_ERROR_INFO *mod_error);
17 
18 //Converts a single Intel IPF error CPER section into JSON IR.
cper_section_ipf_to_ir(const UINT8 * section,UINT32 size)19 json_object *cper_section_ipf_to_ir(const UINT8 *section, UINT32 size)
20 {
21 	if (size < sizeof(EFI_IPF_ERROR_INFO_HEADER)) {
22 		return NULL;
23 	}
24 
25 	EFI_IPF_ERROR_INFO_HEADER *ipf_error =
26 		(EFI_IPF_ERROR_INFO_HEADER *)section;
27 	json_object *section_ir = json_object_new_object();
28 
29 	//Validation bits.
30 	json_object *validation = json_object_new_object();
31 	json_object_object_add(validation, "errorMapValid",
32 			       json_object_new_boolean(
33 				       ipf_error->ValidBits.ProcErrorMapValid));
34 	json_object_object_add(validation, "stateParameterValid",
35 			       json_object_new_boolean(
36 				       ipf_error->ValidBits.ProcErrorMapValid));
37 	json_object_object_add(
38 		validation, "crLIDValid",
39 		json_object_new_boolean(ipf_error->ValidBits.ProcCrLidValid));
40 	json_object_object_add(
41 		validation, "psiStaticStructValid",
42 		json_object_new_boolean(
43 			ipf_error->ValidBits.PsiStaticStructValid));
44 	json_object_object_add(
45 		validation, "cpuInfoValid",
46 		json_object_new_boolean(ipf_error->ValidBits.CpuIdInfoValid));
47 	json_object_object_add(section_ir, "validationBits", validation);
48 
49 	//Numbers of various variable length segments.
50 	json_object_object_add(
51 		section_ir, "cacheCheckNum",
52 		json_object_new_uint64(ipf_error->ValidBits.CacheCheckNum));
53 	json_object_object_add(
54 		section_ir, "tlbCheckNum",
55 		json_object_new_uint64(ipf_error->ValidBits.TlbCheckNum));
56 	json_object_object_add(
57 		section_ir, "busCheckNum",
58 		json_object_new_uint64(ipf_error->ValidBits.BusCheckNum));
59 	json_object_object_add(
60 		section_ir, "regFileCheckNum",
61 		json_object_new_uint64(ipf_error->ValidBits.RegFileCheckNum));
62 	json_object_object_add(
63 		section_ir, "msCheckNum",
64 		json_object_new_uint64(ipf_error->ValidBits.MsCheckNum));
65 
66 	//Process error map, state params/CR LID.
67 	json_object_object_add(section_ir, "procErrorMap",
68 			       json_object_new_uint64(ipf_error->ProcErrorMap));
69 	json_object_object_add(
70 		section_ir, "procStateParameter",
71 		json_object_new_uint64(ipf_error->ProcStateParameter));
72 	json_object_object_add(section_ir, "procCRLID",
73 			       json_object_new_uint64(ipf_error->ProcCrLid));
74 
75 	//Read cache, TLB, bus, register file, MS errors.
76 	EFI_IPF_MOD_ERROR_INFO *cur_error =
77 		(EFI_IPF_MOD_ERROR_INFO *)(ipf_error + 1);
78 	json_object_object_add(section_ir, "cacheErrors",
79 			       cper_ipf_mod_error_read_array(
80 				       &cur_error,
81 				       ipf_error->ValidBits.CacheCheckNum));
82 	json_object_object_add(section_ir, "tlbErrors",
83 			       cper_ipf_mod_error_read_array(
84 				       &cur_error,
85 				       ipf_error->ValidBits.TlbCheckNum));
86 	json_object_object_add(section_ir, "busErrors",
87 			       cper_ipf_mod_error_read_array(
88 				       &cur_error,
89 				       ipf_error->ValidBits.BusCheckNum));
90 	json_object_object_add(section_ir, "regFileErrors",
91 			       cper_ipf_mod_error_read_array(
92 				       &cur_error,
93 				       ipf_error->ValidBits.RegFileCheckNum));
94 	json_object_object_add(
95 		section_ir, "msErrors",
96 		cper_ipf_mod_error_read_array(&cur_error,
97 					      ipf_error->ValidBits.MsCheckNum));
98 
99 	//CPU ID information.
100 	EFI_IPF_CPU_INFO *cpu_info = (EFI_IPF_CPU_INFO *)cur_error;
101 	//stretch: find out how this is represented
102 
103 	//Processor static information.
104 	EFI_IPF_PSI_STATIC *psi_static = (EFI_IPF_PSI_STATIC *)(cpu_info + 1);
105 	json_object *psi_static_ir = json_object_new_object();
106 
107 	//PSI validation bits.
108 	json_object *psi_validation =
109 		bitfield_to_ir(psi_static->ValidBits, 6,
110 			       IPF_PSI_STATIC_INFO_VALID_BITFIELD_NAMES);
111 	json_object_object_add(psi_static_ir, "validationBits", psi_validation);
112 
113 	//PSI minimal state save info.
114 	//stretch: structure min save state area as in Intel Itanium Architecture Software Developer's Manual.
115 
116 	//BRs, CRs, ARs, RRs, FRs.
117 	json_object_object_add(psi_static_ir, "brs",
118 			       uint64_array_to_ir_array(psi_static->Brs, 8));
119 	json_object_object_add(psi_static_ir, "crs",
120 			       uint64_array_to_ir_array(psi_static->Crs, 128));
121 	json_object_object_add(psi_static_ir, "ars",
122 			       uint64_array_to_ir_array(psi_static->Ars, 128));
123 	json_object_object_add(psi_static_ir, "rrs",
124 			       uint64_array_to_ir_array(psi_static->Rrs, 8));
125 	json_object_object_add(psi_static_ir, "frs",
126 			       uint64_array_to_ir_array(psi_static->Frs, 256));
127 	json_object_object_add(section_ir, "psiStaticInfo", psi_static_ir);
128 
129 	return section_ir;
130 }
131 
132 //Reads a continuous stream of CPER IPF mod errors beginning from the given pointer, for n entries.
133 //Returns an array containing all read entries as JSON IR.
cper_ipf_mod_error_read_array(EFI_IPF_MOD_ERROR_INFO ** cur_error,int num_to_read)134 json_object *cper_ipf_mod_error_read_array(EFI_IPF_MOD_ERROR_INFO **cur_error,
135 					   int num_to_read)
136 {
137 	json_object *error_array = json_object_new_array();
138 	for (int i = 0; i < num_to_read; i++) {
139 		json_object_array_add(error_array,
140 				      cper_ipf_mod_error_to_ir(*cur_error));
141 		*cur_error = *cur_error + 1;
142 	}
143 
144 	return error_array;
145 }
146 
147 //Converts a single CPER IPF mod error info structure into JSON IR.
cper_ipf_mod_error_to_ir(EFI_IPF_MOD_ERROR_INFO * mod_error)148 json_object *cper_ipf_mod_error_to_ir(EFI_IPF_MOD_ERROR_INFO *mod_error)
149 {
150 	json_object *mod_error_ir = json_object_new_object();
151 
152 	//Validation bits.
153 	json_object *validation = bitfield_to_ir(
154 		mod_error->ValidBits, 5, IPF_MOD_ERROR_VALID_BITFIELD_NAMES);
155 	json_object_object_add(mod_error_ir, "validationBits", validation);
156 
157 	//Numeric fields.
158 	json_object_object_add(mod_error_ir, "modCheckInfo",
159 			       json_object_new_uint64(mod_error->ModCheckInfo));
160 	json_object_object_add(mod_error_ir, "modTargetID",
161 			       json_object_new_uint64(mod_error->ModTargetId));
162 	json_object_object_add(
163 		mod_error_ir, "modRequestorID",
164 		json_object_new_uint64(mod_error->ModRequestorId));
165 	json_object_object_add(
166 		mod_error_ir, "modResponderID",
167 		json_object_new_uint64(mod_error->ModResponderId));
168 	json_object_object_add(mod_error_ir, "modPreciseIP",
169 			       json_object_new_uint64(mod_error->ModPreciseIp));
170 
171 	return mod_error_ir;
172 }
173