static void decode_mc1_mce(struct mce *m) { u16 ec = EC(m->status); u8 xec = XEC(m->status, xec_mask); pr_emerg(HW_ERR "MC1 Error: "); if (TLB_ERROR(ec)) pr_cont("%s TLB %s.\n", LL_MSG(ec), (xec ? "multimatch" : "parity error")); else if (BUS_ERROR(ec)) { bool k8 = (boot_cpu_data.x86 == 0xf && (m->status & BIT_64(58))); pr_cont("during %s.\n", (k8 ? "system linefill" : "NB data read")); } else if (INT_ERROR(ec)) { if (xec <= 0x3f) pr_cont("Hardware Assert.\n"); else goto wrong_mc1_mce; } else if (fam_ops->mc1_mce(ec, xec)) ; else goto wrong_mc1_mce; return; wrong_mc1_mce: pr_emerg(HW_ERR "Corrupted MC1 MCE info?\n"); }
static bool f15h_mc0_mce(u16 ec, u8 xec) { bool ret = true; if (MEM_ERROR(ec)) { switch (xec) { case 0x0: pr_cont("Data Array access error.\n"); break; case 0x1: pr_cont("UC error during a linefill from L2/NB.\n"); break; case 0x2: case 0x11: pr_cont("STQ access error.\n"); break; case 0x3: pr_cont("SCB access error.\n"); break; case 0x10: pr_cont("Tag error.\n"); break; case 0x12: pr_cont("LDQ access error.\n"); break; default: ret = false; } } else if (BUS_ERROR(ec)) { if (!xec) pr_cont("System Read Data Error.\n"); else pr_cont(" Internal error condition type %d.\n", xec); } else if (INT_ERROR(ec)) { if (xec <= 0x1f) pr_cont("Hardware Assert.\n"); else ret = false; } else ret = false; return ret; }
static inline void amd_decode_err_code(u16 ec) { if (INT_ERROR(ec)) { pr_emerg(HW_ERR "internal: %s\n", UU_MSG(ec)); return; } pr_emerg(HW_ERR "cache level: %s", LL_MSG(ec)); if (BUS_ERROR(ec)) pr_cont(", mem/io: %s", II_MSG(ec)); else pr_cont(", tx: %s", TT_MSG(ec)); if (MEM_ERROR(ec) || BUS_ERROR(ec)) { pr_cont(", mem-tx: %s", R4_MSG(ec)); if (BUS_ERROR(ec)) pr_cont(", part-proc: %s (%s)", PP_MSG(ec), TO_MSG(ec)); } pr_cont("\n"); }