uint64_t status = e->status;
uint32_t mca = status & 0xffff;
uint64_t misc = e->misc;
+ unsigned channel, dimm;
if ((mca >> 11) == 1) { /* bus and interconnect QPI */
decode_bitfield(e, status, qpi_status);
if (status & MCI_STATUS_MISCV)
decode_numfield(e, misc, nhm_memory_misc_numbers);
}
+
+ if ((((status & 0xffff) >> 7) == 1) && (status & MCI_STATUS_MISCV)) {
+ channel = EXTRACT(e->misc, 18, 19);
+ dimm = EXTRACT(e->misc, 16, 17);
+ mce_snprintf(e->mc_location, "channel=%d, dimm=%d",
+ channel, dimm);
+ }
}
/* Only core errors supported. Same as Nehalem */
decode_bitfield(e, status, internal_error_status);
decode_numfield(e, status, internal_error_numbers);
}
-#if 0
- xeon75xx_decode_dimm(m, msize);
-#endif
-}
-
-#if 0
-/* Nehalem-EP specific DIMM decoding */
-void nehalem_memerr_misc(struct mce *m, int *channel, int *dimm)
-{
- if (m->status & MCI_STATUS_MISCV) {
- *channel = EXTRACT(m->misc, 18, 19);
- *dimm = EXTRACT(m->misc, 16, 17);
- }
}
-#endif
\ No newline at end of file
decode_mcg(e);
decode_mci(e, &ismemerr);
+ /* Check if the error is at the memory controller */
+ if (((e->status & 0xffff) >> 7) == 1) {
+ unsigned corr_err_cnt;
+
+ corr_err_cnt = EXTRACT(e->status, 38, 52);
+ mce_snprintf(e->mc_location, "n_errors=%d", corr_err_cnt);
+ }
+
if (test_prefix(11, (e->status & 0xffffL))) {
switch(mce->cputype) {
case CPU_P6OLD: