mce_power.c (7f177f9810ada8ec2e8b378eddbe2d91fda79c9b) | mce_power.c (cda6618d060b5e8afc93e691d4bcd987f3dd4393) |
---|---|
1/* 2 * Machine check exception handling CPU-side for power7 and power8 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; either version 2 of the License, or 7 * (at your option) any later version. 8 * --- 119 unchanged lines hidden (view full) --- 128struct mce_ierror_table { 129 unsigned long srr1_mask; 130 unsigned long srr1_value; 131 bool nip_valid; /* nip is a valid indicator of faulting address */ 132 unsigned int error_type; 133 unsigned int error_subtype; 134 unsigned int initiator; 135 unsigned int severity; | 1/* 2 * Machine check exception handling CPU-side for power7 and power8 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; either version 2 of the License, or 7 * (at your option) any later version. 8 * --- 119 unchanged lines hidden (view full) --- 128struct mce_ierror_table { 129 unsigned long srr1_mask; 130 unsigned long srr1_value; 131 bool nip_valid; /* nip is a valid indicator of faulting address */ 132 unsigned int error_type; 133 unsigned int error_subtype; 134 unsigned int initiator; 135 unsigned int severity; |
136 bool sync_error; |
|
136}; 137 138static const struct mce_ierror_table mce_p7_ierror_table[] = { 139{ 0x00000000001c0000, 0x0000000000040000, true, 140 MCE_ERROR_TYPE_UE, MCE_UE_ERROR_IFETCH, | 137}; 138 139static const struct mce_ierror_table mce_p7_ierror_table[] = { 140{ 0x00000000001c0000, 0x0000000000040000, true, 141 MCE_ERROR_TYPE_UE, MCE_UE_ERROR_IFETCH, |
141 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 142 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, |
142{ 0x00000000001c0000, 0x0000000000080000, true, 143 MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_PARITY, | 143{ 0x00000000001c0000, 0x0000000000080000, true, 144 MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_PARITY, |
144 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 145 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, |
145{ 0x00000000001c0000, 0x00000000000c0000, true, 146 MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_MULTIHIT, | 146{ 0x00000000001c0000, 0x00000000000c0000, true, 147 MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_MULTIHIT, |
147 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 148 MCE_INITIATOR_CPU, MCE_SEV_WARNING, true }, |
148{ 0x00000000001c0000, 0x0000000000100000, true, 149 MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_INDETERMINATE, /* BOTH */ | 149{ 0x00000000001c0000, 0x0000000000100000, true, 150 MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_INDETERMINATE, /* BOTH */ |
150 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 151 MCE_INITIATOR_CPU, MCE_SEV_WARNING, true }, |
151{ 0x00000000001c0000, 0x0000000000140000, true, 152 MCE_ERROR_TYPE_TLB, MCE_TLB_ERROR_MULTIHIT, | 152{ 0x00000000001c0000, 0x0000000000140000, true, 153 MCE_ERROR_TYPE_TLB, MCE_TLB_ERROR_MULTIHIT, |
153 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 154 MCE_INITIATOR_CPU, MCE_SEV_WARNING, true }, |
154{ 0x00000000001c0000, 0x0000000000180000, true, 155 MCE_ERROR_TYPE_UE, MCE_UE_ERROR_PAGE_TABLE_WALK_IFETCH, | 155{ 0x00000000001c0000, 0x0000000000180000, true, 156 MCE_ERROR_TYPE_UE, MCE_UE_ERROR_PAGE_TABLE_WALK_IFETCH, |
156 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 157 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, |
157{ 0x00000000001c0000, 0x00000000001c0000, true, 158 MCE_ERROR_TYPE_UE, MCE_UE_ERROR_IFETCH, | 158{ 0x00000000001c0000, 0x00000000001c0000, true, 159 MCE_ERROR_TYPE_UE, MCE_UE_ERROR_IFETCH, |
159 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, 160{ 0, 0, 0, 0, 0, 0 } }; | 160 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, 161{ 0, 0, 0, 0, 0, 0, 0 } }; |
161 162static const struct mce_ierror_table mce_p8_ierror_table[] = { 163{ 0x00000000081c0000, 0x0000000000040000, true, 164 MCE_ERROR_TYPE_UE, MCE_UE_ERROR_IFETCH, | 162 163static const struct mce_ierror_table mce_p8_ierror_table[] = { 164{ 0x00000000081c0000, 0x0000000000040000, true, 165 MCE_ERROR_TYPE_UE, MCE_UE_ERROR_IFETCH, |
165 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 166 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, |
166{ 0x00000000081c0000, 0x0000000000080000, true, 167 MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_PARITY, | 167{ 0x00000000081c0000, 0x0000000000080000, true, 168 MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_PARITY, |
168 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 169 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, |
169{ 0x00000000081c0000, 0x00000000000c0000, true, 170 MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_MULTIHIT, | 170{ 0x00000000081c0000, 0x00000000000c0000, true, 171 MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_MULTIHIT, |
171 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 172 MCE_INITIATOR_CPU, MCE_SEV_WARNING, true }, |
172{ 0x00000000081c0000, 0x0000000000100000, true, 173 MCE_ERROR_TYPE_ERAT,MCE_ERAT_ERROR_MULTIHIT, | 173{ 0x00000000081c0000, 0x0000000000100000, true, 174 MCE_ERROR_TYPE_ERAT,MCE_ERAT_ERROR_MULTIHIT, |
174 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 175 MCE_INITIATOR_CPU, MCE_SEV_WARNING, true }, |
175{ 0x00000000081c0000, 0x0000000000140000, true, 176 MCE_ERROR_TYPE_TLB, MCE_TLB_ERROR_MULTIHIT, | 176{ 0x00000000081c0000, 0x0000000000140000, true, 177 MCE_ERROR_TYPE_TLB, MCE_TLB_ERROR_MULTIHIT, |
177 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 178 MCE_INITIATOR_CPU, MCE_SEV_WARNING, true }, |
178{ 0x00000000081c0000, 0x0000000000180000, true, 179 MCE_ERROR_TYPE_UE, MCE_UE_ERROR_PAGE_TABLE_WALK_IFETCH, | 179{ 0x00000000081c0000, 0x0000000000180000, true, 180 MCE_ERROR_TYPE_UE, MCE_UE_ERROR_PAGE_TABLE_WALK_IFETCH, |
180 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 181 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, |
181{ 0x00000000081c0000, 0x00000000001c0000, true, 182 MCE_ERROR_TYPE_UE, MCE_UE_ERROR_IFETCH, | 182{ 0x00000000081c0000, 0x00000000001c0000, true, 183 MCE_ERROR_TYPE_UE, MCE_UE_ERROR_IFETCH, |
183 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 184 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, |
184{ 0x00000000081c0000, 0x0000000008000000, true, 185 MCE_ERROR_TYPE_LINK,MCE_LINK_ERROR_IFETCH_TIMEOUT, | 185{ 0x00000000081c0000, 0x0000000008000000, true, 186 MCE_ERROR_TYPE_LINK,MCE_LINK_ERROR_IFETCH_TIMEOUT, |
186 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 187 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, |
187{ 0x00000000081c0000, 0x0000000008040000, true, 188 MCE_ERROR_TYPE_LINK,MCE_LINK_ERROR_PAGE_TABLE_WALK_IFETCH_TIMEOUT, | 188{ 0x00000000081c0000, 0x0000000008040000, true, 189 MCE_ERROR_TYPE_LINK,MCE_LINK_ERROR_PAGE_TABLE_WALK_IFETCH_TIMEOUT, |
189 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, 190{ 0, 0, 0, 0, 0, 0 } }; | 190 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, 191{ 0, 0, 0, 0, 0, 0, 0 } }; |
191 192static const struct mce_ierror_table mce_p9_ierror_table[] = { 193{ 0x00000000081c0000, 0x0000000000040000, true, 194 MCE_ERROR_TYPE_UE, MCE_UE_ERROR_IFETCH, | 192 193static const struct mce_ierror_table mce_p9_ierror_table[] = { 194{ 0x00000000081c0000, 0x0000000000040000, true, 195 MCE_ERROR_TYPE_UE, MCE_UE_ERROR_IFETCH, |
195 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 196 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, |
196{ 0x00000000081c0000, 0x0000000000080000, true, 197 MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_PARITY, | 197{ 0x00000000081c0000, 0x0000000000080000, true, 198 MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_PARITY, |
198 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 199 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, |
199{ 0x00000000081c0000, 0x00000000000c0000, true, 200 MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_MULTIHIT, | 200{ 0x00000000081c0000, 0x00000000000c0000, true, 201 MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_MULTIHIT, |
201 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 202 MCE_INITIATOR_CPU, MCE_SEV_WARNING, true }, |
202{ 0x00000000081c0000, 0x0000000000100000, true, 203 MCE_ERROR_TYPE_ERAT,MCE_ERAT_ERROR_MULTIHIT, | 203{ 0x00000000081c0000, 0x0000000000100000, true, 204 MCE_ERROR_TYPE_ERAT,MCE_ERAT_ERROR_MULTIHIT, |
204 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 205 MCE_INITIATOR_CPU, MCE_SEV_WARNING, true }, |
205{ 0x00000000081c0000, 0x0000000000140000, true, 206 MCE_ERROR_TYPE_TLB, MCE_TLB_ERROR_MULTIHIT, | 206{ 0x00000000081c0000, 0x0000000000140000, true, 207 MCE_ERROR_TYPE_TLB, MCE_TLB_ERROR_MULTIHIT, |
207 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 208 MCE_INITIATOR_CPU, MCE_SEV_WARNING, true }, |
208{ 0x00000000081c0000, 0x0000000000180000, true, 209 MCE_ERROR_TYPE_UE, MCE_UE_ERROR_PAGE_TABLE_WALK_IFETCH, | 209{ 0x00000000081c0000, 0x0000000000180000, true, 210 MCE_ERROR_TYPE_UE, MCE_UE_ERROR_PAGE_TABLE_WALK_IFETCH, |
210 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 211 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, |
211{ 0x00000000081c0000, 0x00000000001c0000, true, 212 MCE_ERROR_TYPE_RA, MCE_RA_ERROR_IFETCH_FOREIGN, | 212{ 0x00000000081c0000, 0x00000000001c0000, true, 213 MCE_ERROR_TYPE_RA, MCE_RA_ERROR_IFETCH_FOREIGN, |
213 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 214 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, |
214{ 0x00000000081c0000, 0x0000000008000000, true, 215 MCE_ERROR_TYPE_LINK,MCE_LINK_ERROR_IFETCH_TIMEOUT, | 215{ 0x00000000081c0000, 0x0000000008000000, true, 216 MCE_ERROR_TYPE_LINK,MCE_LINK_ERROR_IFETCH_TIMEOUT, |
216 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 217 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, |
217{ 0x00000000081c0000, 0x0000000008040000, true, 218 MCE_ERROR_TYPE_LINK,MCE_LINK_ERROR_PAGE_TABLE_WALK_IFETCH_TIMEOUT, | 218{ 0x00000000081c0000, 0x0000000008040000, true, 219 MCE_ERROR_TYPE_LINK,MCE_LINK_ERROR_PAGE_TABLE_WALK_IFETCH_TIMEOUT, |
219 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 220 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, |
220{ 0x00000000081c0000, 0x00000000080c0000, true, 221 MCE_ERROR_TYPE_RA, MCE_RA_ERROR_IFETCH, | 221{ 0x00000000081c0000, 0x00000000080c0000, true, 222 MCE_ERROR_TYPE_RA, MCE_RA_ERROR_IFETCH, |
222 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 223 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, |
223{ 0x00000000081c0000, 0x0000000008100000, true, 224 MCE_ERROR_TYPE_RA, MCE_RA_ERROR_PAGE_TABLE_WALK_IFETCH, | 224{ 0x00000000081c0000, 0x0000000008100000, true, 225 MCE_ERROR_TYPE_RA, MCE_RA_ERROR_PAGE_TABLE_WALK_IFETCH, |
225 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 226 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, |
226{ 0x00000000081c0000, 0x0000000008140000, false, 227 MCE_ERROR_TYPE_RA, MCE_RA_ERROR_STORE, | 227{ 0x00000000081c0000, 0x0000000008140000, false, 228 MCE_ERROR_TYPE_RA, MCE_RA_ERROR_STORE, |
228 MCE_INITIATOR_CPU, MCE_SEV_FATAL, }, /* ASYNC is fatal */ | 229 MCE_INITIATOR_CPU, MCE_SEV_FATAL, false }, /* ASYNC is fatal */ |
229{ 0x00000000081c0000, 0x0000000008180000, false, 230 MCE_ERROR_TYPE_LINK,MCE_LINK_ERROR_STORE_TIMEOUT, | 230{ 0x00000000081c0000, 0x0000000008180000, false, 231 MCE_ERROR_TYPE_LINK,MCE_LINK_ERROR_STORE_TIMEOUT, |
231 MCE_INITIATOR_CPU, MCE_SEV_FATAL, }, /* ASYNC is fatal */ | 232 MCE_INITIATOR_CPU, MCE_SEV_FATAL, false }, /* ASYNC is fatal */ |
232{ 0x00000000081c0000, 0x00000000081c0000, true, 233 MCE_ERROR_TYPE_RA, MCE_RA_ERROR_PAGE_TABLE_WALK_IFETCH_FOREIGN, | 233{ 0x00000000081c0000, 0x00000000081c0000, true, 234 MCE_ERROR_TYPE_RA, MCE_RA_ERROR_PAGE_TABLE_WALK_IFETCH_FOREIGN, |
234 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, 235{ 0, 0, 0, 0, 0, 0 } }; | 235 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, 236{ 0, 0, 0, 0, 0, 0, 0 } }; |
236 237struct mce_derror_table { 238 unsigned long dsisr_value; 239 bool dar_valid; /* dar is a valid indicator of faulting address */ 240 unsigned int error_type; 241 unsigned int error_subtype; 242 unsigned int initiator; 243 unsigned int severity; | 237 238struct mce_derror_table { 239 unsigned long dsisr_value; 240 bool dar_valid; /* dar is a valid indicator of faulting address */ 241 unsigned int error_type; 242 unsigned int error_subtype; 243 unsigned int initiator; 244 unsigned int severity; |
245 bool sync_error; |
|
244}; 245 246static const struct mce_derror_table mce_p7_derror_table[] = { 247{ 0x00008000, false, 248 MCE_ERROR_TYPE_UE, MCE_UE_ERROR_LOAD_STORE, | 246}; 247 248static const struct mce_derror_table mce_p7_derror_table[] = { 249{ 0x00008000, false, 250 MCE_ERROR_TYPE_UE, MCE_UE_ERROR_LOAD_STORE, |
249 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 251 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, |
250{ 0x00004000, true, 251 MCE_ERROR_TYPE_UE, MCE_UE_ERROR_PAGE_TABLE_WALK_LOAD_STORE, | 252{ 0x00004000, true, 253 MCE_ERROR_TYPE_UE, MCE_UE_ERROR_PAGE_TABLE_WALK_LOAD_STORE, |
252 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 254 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, |
253{ 0x00000800, true, 254 MCE_ERROR_TYPE_ERAT, MCE_ERAT_ERROR_MULTIHIT, | 255{ 0x00000800, true, 256 MCE_ERROR_TYPE_ERAT, MCE_ERAT_ERROR_MULTIHIT, |
255 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 257 MCE_INITIATOR_CPU, MCE_SEV_WARNING, true }, |
256{ 0x00000400, true, 257 MCE_ERROR_TYPE_TLB, MCE_TLB_ERROR_MULTIHIT, | 258{ 0x00000400, true, 259 MCE_ERROR_TYPE_TLB, MCE_TLB_ERROR_MULTIHIT, |
258 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 260 MCE_INITIATOR_CPU, MCE_SEV_WARNING, true }, |
259{ 0x00000080, true, 260 MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_MULTIHIT, /* Before PARITY */ | 261{ 0x00000080, true, 262 MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_MULTIHIT, /* Before PARITY */ |
261 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 263 MCE_INITIATOR_CPU, MCE_SEV_WARNING, true }, |
262{ 0x00000100, true, 263 MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_PARITY, | 264{ 0x00000100, true, 265 MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_PARITY, |
264 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 266 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, |
265{ 0x00000040, true, 266 MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_INDETERMINATE, /* BOTH */ | 267{ 0x00000040, true, 268 MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_INDETERMINATE, /* BOTH */ |
267 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, 268{ 0, false, 0, 0, 0, 0 } }; | 269 MCE_INITIATOR_CPU, MCE_SEV_WARNING, true }, 270{ 0, false, 0, 0, 0, 0, 0 } }; |
269 270static const struct mce_derror_table mce_p8_derror_table[] = { 271{ 0x00008000, false, 272 MCE_ERROR_TYPE_UE, MCE_UE_ERROR_LOAD_STORE, | 271 272static const struct mce_derror_table mce_p8_derror_table[] = { 273{ 0x00008000, false, 274 MCE_ERROR_TYPE_UE, MCE_UE_ERROR_LOAD_STORE, |
273 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 275 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, |
274{ 0x00004000, true, 275 MCE_ERROR_TYPE_UE, MCE_UE_ERROR_PAGE_TABLE_WALK_LOAD_STORE, | 276{ 0x00004000, true, 277 MCE_ERROR_TYPE_UE, MCE_UE_ERROR_PAGE_TABLE_WALK_LOAD_STORE, |
276 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 278 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, |
277{ 0x00002000, true, 278 MCE_ERROR_TYPE_LINK, MCE_LINK_ERROR_LOAD_TIMEOUT, | 279{ 0x00002000, true, 280 MCE_ERROR_TYPE_LINK, MCE_LINK_ERROR_LOAD_TIMEOUT, |
279 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 281 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, |
280{ 0x00001000, true, 281 MCE_ERROR_TYPE_LINK, MCE_LINK_ERROR_PAGE_TABLE_WALK_LOAD_STORE_TIMEOUT, | 282{ 0x00001000, true, 283 MCE_ERROR_TYPE_LINK, MCE_LINK_ERROR_PAGE_TABLE_WALK_LOAD_STORE_TIMEOUT, |
282 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 284 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, |
283{ 0x00000800, true, 284 MCE_ERROR_TYPE_ERAT, MCE_ERAT_ERROR_MULTIHIT, | 285{ 0x00000800, true, 286 MCE_ERROR_TYPE_ERAT, MCE_ERAT_ERROR_MULTIHIT, |
285 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 287 MCE_INITIATOR_CPU, MCE_SEV_WARNING, true }, |
286{ 0x00000400, true, 287 MCE_ERROR_TYPE_TLB, MCE_TLB_ERROR_MULTIHIT, | 288{ 0x00000400, true, 289 MCE_ERROR_TYPE_TLB, MCE_TLB_ERROR_MULTIHIT, |
288 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 290 MCE_INITIATOR_CPU, MCE_SEV_WARNING, true }, |
289{ 0x00000200, true, 290 MCE_ERROR_TYPE_ERAT, MCE_ERAT_ERROR_MULTIHIT, /* SECONDARY ERAT */ | 291{ 0x00000200, true, 292 MCE_ERROR_TYPE_ERAT, MCE_ERAT_ERROR_MULTIHIT, /* SECONDARY ERAT */ |
291 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 293 MCE_INITIATOR_CPU, MCE_SEV_WARNING, true }, |
292{ 0x00000080, true, 293 MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_MULTIHIT, /* Before PARITY */ | 294{ 0x00000080, true, 295 MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_MULTIHIT, /* Before PARITY */ |
294 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 296 MCE_INITIATOR_CPU, MCE_SEV_WARNING, true }, |
295{ 0x00000100, true, 296 MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_PARITY, | 297{ 0x00000100, true, 298 MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_PARITY, |
297 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, 298{ 0, false, 0, 0, 0, 0 } }; | 299 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, 300{ 0, false, 0, 0, 0, 0, 0 } }; |
299 300static const struct mce_derror_table mce_p9_derror_table[] = { 301{ 0x00008000, false, 302 MCE_ERROR_TYPE_UE, MCE_UE_ERROR_LOAD_STORE, | 301 302static const struct mce_derror_table mce_p9_derror_table[] = { 303{ 0x00008000, false, 304 MCE_ERROR_TYPE_UE, MCE_UE_ERROR_LOAD_STORE, |
303 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 305 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, |
304{ 0x00004000, true, 305 MCE_ERROR_TYPE_UE, MCE_UE_ERROR_PAGE_TABLE_WALK_LOAD_STORE, | 306{ 0x00004000, true, 307 MCE_ERROR_TYPE_UE, MCE_UE_ERROR_PAGE_TABLE_WALK_LOAD_STORE, |
306 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 308 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, |
307{ 0x00002000, true, 308 MCE_ERROR_TYPE_LINK, MCE_LINK_ERROR_LOAD_TIMEOUT, | 309{ 0x00002000, true, 310 MCE_ERROR_TYPE_LINK, MCE_LINK_ERROR_LOAD_TIMEOUT, |
309 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 311 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, |
310{ 0x00001000, true, 311 MCE_ERROR_TYPE_LINK, MCE_LINK_ERROR_PAGE_TABLE_WALK_LOAD_STORE_TIMEOUT, | 312{ 0x00001000, true, 313 MCE_ERROR_TYPE_LINK, MCE_LINK_ERROR_PAGE_TABLE_WALK_LOAD_STORE_TIMEOUT, |
312 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 314 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, |
313{ 0x00000800, true, 314 MCE_ERROR_TYPE_ERAT, MCE_ERAT_ERROR_MULTIHIT, | 315{ 0x00000800, true, 316 MCE_ERROR_TYPE_ERAT, MCE_ERAT_ERROR_MULTIHIT, |
315 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 317 MCE_INITIATOR_CPU, MCE_SEV_WARNING, true }, |
316{ 0x00000400, true, 317 MCE_ERROR_TYPE_TLB, MCE_TLB_ERROR_MULTIHIT, | 318{ 0x00000400, true, 319 MCE_ERROR_TYPE_TLB, MCE_TLB_ERROR_MULTIHIT, |
318 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 320 MCE_INITIATOR_CPU, MCE_SEV_WARNING, true }, |
319{ 0x00000200, false, 320 MCE_ERROR_TYPE_USER, MCE_USER_ERROR_TLBIE, | 321{ 0x00000200, false, 322 MCE_ERROR_TYPE_USER, MCE_USER_ERROR_TLBIE, |
321 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 323 MCE_INITIATOR_CPU, MCE_SEV_WARNING, true }, |
322{ 0x00000080, true, 323 MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_MULTIHIT, /* Before PARITY */ | 324{ 0x00000080, true, 325 MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_MULTIHIT, /* Before PARITY */ |
324 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 326 MCE_INITIATOR_CPU, MCE_SEV_WARNING, true }, |
325{ 0x00000100, true, 326 MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_PARITY, | 327{ 0x00000100, true, 328 MCE_ERROR_TYPE_SLB, MCE_SLB_ERROR_PARITY, |
327 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 329 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, |
328{ 0x00000040, true, 329 MCE_ERROR_TYPE_RA, MCE_RA_ERROR_LOAD, | 330{ 0x00000040, true, 331 MCE_ERROR_TYPE_RA, MCE_RA_ERROR_LOAD, |
330 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 332 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, |
331{ 0x00000020, false, 332 MCE_ERROR_TYPE_RA, MCE_RA_ERROR_PAGE_TABLE_WALK_LOAD_STORE, | 333{ 0x00000020, false, 334 MCE_ERROR_TYPE_RA, MCE_RA_ERROR_PAGE_TABLE_WALK_LOAD_STORE, |
333 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 335 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, |
334{ 0x00000010, false, 335 MCE_ERROR_TYPE_RA, MCE_RA_ERROR_PAGE_TABLE_WALK_LOAD_STORE_FOREIGN, | 336{ 0x00000010, false, 337 MCE_ERROR_TYPE_RA, MCE_RA_ERROR_PAGE_TABLE_WALK_LOAD_STORE_FOREIGN, |
336 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, | 338 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, |
337{ 0x00000008, false, 338 MCE_ERROR_TYPE_RA, MCE_RA_ERROR_LOAD_STORE_FOREIGN, | 339{ 0x00000008, false, 340 MCE_ERROR_TYPE_RA, MCE_RA_ERROR_LOAD_STORE_FOREIGN, |
339 MCE_INITIATOR_CPU, MCE_SEV_ERROR_SYNC, }, 340{ 0, false, 0, 0, 0, 0 } }; | 341 MCE_INITIATOR_CPU, MCE_SEV_SEVERE, true }, 342{ 0, false, 0, 0, 0, 0, 0 } }; |
341 342static int mce_find_instr_ea_and_pfn(struct pt_regs *regs, uint64_t *addr, 343 uint64_t *phys_addr) 344{ 345 /* 346 * Carefully look at the NIP to determine 347 * the instruction to analyse. Reading the NIP 348 * in real-mode is tricky and can lead to recursive --- 73 unchanged lines hidden (view full) --- 422 break; 423 case MCE_ERROR_TYPE_RA: 424 mce_err->u.ra_error_type = table[i].error_subtype; 425 break; 426 case MCE_ERROR_TYPE_LINK: 427 mce_err->u.link_error_type = table[i].error_subtype; 428 break; 429 } | 343 344static int mce_find_instr_ea_and_pfn(struct pt_regs *regs, uint64_t *addr, 345 uint64_t *phys_addr) 346{ 347 /* 348 * Carefully look at the NIP to determine 349 * the instruction to analyse. Reading the NIP 350 * in real-mode is tricky and can lead to recursive --- 73 unchanged lines hidden (view full) --- 424 break; 425 case MCE_ERROR_TYPE_RA: 426 mce_err->u.ra_error_type = table[i].error_subtype; 427 break; 428 case MCE_ERROR_TYPE_LINK: 429 mce_err->u.link_error_type = table[i].error_subtype; 430 break; 431 } |
432 mce_err->sync_error = table[i].sync_error; |
|
430 mce_err->severity = table[i].severity; 431 mce_err->initiator = table[i].initiator; 432 if (table[i].nip_valid) { 433 *addr = regs->nip; | 433 mce_err->severity = table[i].severity; 434 mce_err->initiator = table[i].initiator; 435 if (table[i].nip_valid) { 436 *addr = regs->nip; |
434 if (mce_err->severity == MCE_SEV_ERROR_SYNC && | 437 if (mce_err->sync_error && |
435 table[i].error_type == MCE_ERROR_TYPE_UE) { 436 unsigned long pfn; 437 438 if (get_paca()->in_mce < MAX_MCE_DEPTH) { 439 pfn = addr_to_pfn(regs, regs->nip); 440 if (pfn != ULONG_MAX) { 441 *phys_addr = 442 (pfn << PAGE_SHIFT); 443 } 444 } 445 } 446 } 447 return handled; 448 } 449 450 mce_err->error_type = MCE_ERROR_TYPE_UNKNOWN; | 438 table[i].error_type == MCE_ERROR_TYPE_UE) { 439 unsigned long pfn; 440 441 if (get_paca()->in_mce < MAX_MCE_DEPTH) { 442 pfn = addr_to_pfn(regs, regs->nip); 443 if (pfn != ULONG_MAX) { 444 *phys_addr = 445 (pfn << PAGE_SHIFT); 446 } 447 } 448 } 449 } 450 return handled; 451 } 452 453 mce_err->error_type = MCE_ERROR_TYPE_UNKNOWN; |
451 mce_err->severity = MCE_SEV_ERROR_SYNC; | 454 mce_err->severity = MCE_SEV_SEVERE; |
452 mce_err->initiator = MCE_INITIATOR_CPU; | 455 mce_err->initiator = MCE_INITIATOR_CPU; |
456 mce_err->sync_error = true; |
|
453 454 return 0; 455} 456 457static int mce_handle_derror(struct pt_regs *regs, 458 const struct mce_derror_table table[], 459 struct mce_error_info *mce_err, uint64_t *addr, 460 uint64_t *phys_addr) --- 53 unchanged lines hidden (view full) --- 514 break; 515 case MCE_ERROR_TYPE_RA: 516 mce_err->u.ra_error_type = table[i].error_subtype; 517 break; 518 case MCE_ERROR_TYPE_LINK: 519 mce_err->u.link_error_type = table[i].error_subtype; 520 break; 521 } | 457 458 return 0; 459} 460 461static int mce_handle_derror(struct pt_regs *regs, 462 const struct mce_derror_table table[], 463 struct mce_error_info *mce_err, uint64_t *addr, 464 uint64_t *phys_addr) --- 53 unchanged lines hidden (view full) --- 518 break; 519 case MCE_ERROR_TYPE_RA: 520 mce_err->u.ra_error_type = table[i].error_subtype; 521 break; 522 case MCE_ERROR_TYPE_LINK: 523 mce_err->u.link_error_type = table[i].error_subtype; 524 break; 525 } |
526 mce_err->sync_error = table[i].sync_error; |
|
522 mce_err->severity = table[i].severity; 523 mce_err->initiator = table[i].initiator; 524 if (table[i].dar_valid) 525 *addr = regs->dar; | 527 mce_err->severity = table[i].severity; 528 mce_err->initiator = table[i].initiator; 529 if (table[i].dar_valid) 530 *addr = regs->dar; |
526 else if (mce_err->severity == MCE_SEV_ERROR_SYNC && | 531 else if (mce_err->sync_error && |
527 table[i].error_type == MCE_ERROR_TYPE_UE) { 528 /* 529 * We do a maximum of 4 nested MCE calls, see 530 * kernel/exception-64s.h 531 */ 532 if (get_paca()->in_mce < MAX_MCE_DEPTH) 533 mce_find_instr_ea_and_pfn(regs, addr, phys_addr); 534 } 535 found = 1; 536 } 537 538 if (found) 539 return handled; 540 541 mce_err->error_type = MCE_ERROR_TYPE_UNKNOWN; | 532 table[i].error_type == MCE_ERROR_TYPE_UE) { 533 /* 534 * We do a maximum of 4 nested MCE calls, see 535 * kernel/exception-64s.h 536 */ 537 if (get_paca()->in_mce < MAX_MCE_DEPTH) 538 mce_find_instr_ea_and_pfn(regs, addr, phys_addr); 539 } 540 found = 1; 541 } 542 543 if (found) 544 return handled; 545 546 mce_err->error_type = MCE_ERROR_TYPE_UNKNOWN; |
542 mce_err->severity = MCE_SEV_ERROR_SYNC; | 547 mce_err->severity = MCE_SEV_SEVERE; |
543 mce_err->initiator = MCE_INITIATOR_CPU; | 548 mce_err->initiator = MCE_INITIATOR_CPU; |
549 mce_err->sync_error = true; |
|
544 545 return 0; 546} 547 548static long mce_handle_ue_error(struct pt_regs *regs) 549{ 550 long handled = 0; 551 --- 68 unchanged lines hidden --- | 550 551 return 0; 552} 553 554static long mce_handle_ue_error(struct pt_regs *regs) 555{ 556 long handled = 0; 557 --- 68 unchanged lines hidden --- |