void machine_check(unsigned long mces, struct trapframe *framep, unsigned long vector, unsigned long param) { const char *type; struct mchkinfo *mcp; mcp = &curcpu()->ci_mcinfo; /* Make sure it's an error we know about. */ if ((mces & (ALPHA_MCES_MIP|ALPHA_MCES_SCE|ALPHA_MCES_PCE)) == 0) { type = "fatal machine check or error (unknown type)"; goto fatal; } /* Machine checks. */ if (mces & ALPHA_MCES_MIP) { /* If we weren't expecting it, then we punt. */ if (!mcp->mc_expected) { type = "unexpected machine check"; goto fatal; } mcp->mc_expected = 0; mcp->mc_received = 1; } /* System correctable errors. */ if (mces & ALPHA_MCES_SCE) printf("Warning: received system correctable error.\n"); /* Processor correctable errors. */ if (mces & ALPHA_MCES_PCE) printf("Warning: received processor correctable error.\n"); /* Clear pending machine checks and correctable errors */ alpha_pal_wrmces(mces); return; fatal: /* Clear pending machine checks and correctable errors */ alpha_pal_wrmces(mces); printf("\n"); printf("%s:\n", type); printf("\n"); printf(" mces = 0x%lx\n", mces); printf(" vector = 0x%lx\n", vector); printf(" param = 0x%lx\n", param); printf(" pc = 0x%lx\n", framep->tf_regs[FRAME_PC]); printf(" ra = 0x%lx\n", framep->tf_regs[FRAME_RA]); printf(" curproc = %p\n", curproc); if (curproc != NULL) printf(" pid = %d, comm = %s\n", curproc->p_pid, curproc->p_comm); printf("\n"); panic("machine check"); }
static void kn300_softerr(unsigned long mces, unsigned long type, unsigned long logout, struct trapframe *framep) { static const char *sys = "system"; static const char *proc = "processor"; int whami; mc_hdr_ev5 *hdr; mc_soft300 *ptr; static const char *fmt1 = " %-25s = 0x%l016x\n"; hdr = (mc_hdr_ev5 *) logout; ptr = (mc_soft300 *) (logout + sizeof (*hdr)); whami = alpha_pal_whami(); printf("kn300: CPU ID %d %s correctable error corrected by %s\n", whami, (type == ALPHA_SYS_ERROR)? sys : proc, ((hdr->mcheck_code & 0xff00) == (EV5_CORRECTED << 16))? proc : (((hdr->mcheck_code & 0xff00) == (CAP_ERR_CRDX << 16)) ? "I/O Bridge Module" : sys)); printf(" Machine Check Code 0x%lx\n", hdr->mcheck_code); printf(" Physical Address of Error 0x%lx\n", ptr->ei_addr); if (ptr->ei_stat & 0x80000000L) printf(" Corrected ECC Error "); else printf(" Other Error"); if (ptr->ei_stat & 0x40000000L) printf("in Memory "); else printf("in B-Cache "); if (ptr->ei_stat & 0x400000000L) printf("during I-Cache fill\n"); else printf("during D-Cache fill\n"); printf(fmt1, "EI Status", ptr->ei_stat); printf(fmt1, "Fill Syndrome", ptr->fill_syndrome); printf(fmt1, "Interrupt Status Reg.", ptr->isr); printf("\n"); printf(fmt1, "Whami Reg.", ptr->whami); printf(fmt1, "Sys. Env. Reg.", ptr->sys_env); printf(fmt1, "MCPCIA Regs.", ptr->mcpcia_regs); printf(fmt1, "PCI Rev. Reg.", ptr->pci_rev); printf(fmt1, "MC_ERR0 Reg.", ptr->mc_err0); printf(fmt1, "MC_ERR1 Reg.", ptr->mc_err1); printf(fmt1, "CAP_ERR Reg.", ptr->cap_err); printf(fmt1, "MDPA_STAT Reg.", ptr->mdpa_stat); printf(fmt1, "MDPA_SYN Reg.", ptr->mdpa_syn); printf(fmt1, "MDPB_STAT Reg.", ptr->mdpb_stat); printf(fmt1, "MDPB_SYN Reg.", ptr->mdpb_syn); /* * Clear error by rewriting register. */ alpha_pal_wrmces(mces); }
/* * Initialize the trap vectors for the current processor. */ void trap_init() { /* * Point interrupt/exception vectors to our own. */ alpha_pal_wrent(XentInt, ALPHA_KENTRY_INT); alpha_pal_wrent(XentArith, ALPHA_KENTRY_ARITH); alpha_pal_wrent(XentMM, ALPHA_KENTRY_MM); alpha_pal_wrent(XentIF, ALPHA_KENTRY_IF); alpha_pal_wrent(XentUna, ALPHA_KENTRY_UNA); alpha_pal_wrent(XentSys, ALPHA_KENTRY_SYS); /* * Clear pending machine checks and error reports, and enable * system- and processor-correctable error reporting. */ alpha_pal_wrmces(alpha_pal_rdmces() & ~(ALPHA_MCES_DSC|ALPHA_MCES_DPC)); }