-#define MC750_TBERR 2 /* type code of cp tbuf par */
-#define MC750_TBPAR 4 /* tbuf par bit in mcesr */
-#endif
-
-#if VAX730
-#define NMC730 12
-char *mc730[] = {
- "tb par", "bad retry", "bad intr id", "cant write ptem",
- "unkn mcr err", "iib rd err", "nxm ref", "cp rds",
- "unalgn ioref", "nonlw ioref", "bad ioaddr", "unalgn ubaddr",
-};
-#endif
-#if VAX630
-#define NMC630 10
-extern struct ka630cpu ka630cpu;
-char *mc630[] = {
- 0, "immcr (fsd)", "immcr (ssd)", "fpu err 0",
- "fpu err 7", "mmu st(tb)", "mmu st(m=0)", "pte in p0",
- "pte in p1", "un intr id",
-};
-#endif
-
-/*
- * Frame for each cpu
- */
-struct mc780frame {
- int mc8_bcnt; /* byte count == 0x28 */
- int mc8_summary; /* summary parameter (as above) */
- int mc8_cpues; /* cpu error status */
- int mc8_upc; /* micro pc */
- int mc8_vaviba; /* va/viba register */
- int mc8_dreg; /* d register */
- int mc8_tber0; /* tbuf error reg 0 */
- int mc8_tber1; /* tbuf error reg 1 */
- int mc8_timo; /* timeout address divided by 4 */
- int mc8_parity; /* parity */
- int mc8_sbier; /* sbi error register */
- int mc8_pc; /* trapped pc */
- int mc8_psl; /* trapped psl */
-};
-struct mc750frame {
- int mc5_bcnt; /* byte count == 0x28 */
- int mc5_summary; /* summary parameter (as above) */
- int mc5_va; /* virtual address register */
- int mc5_errpc; /* error pc */
- int mc5_mdr;
- int mc5_svmode; /* saved mode register */
- int mc5_rdtimo; /* read lock timeout */
- int mc5_tbgpar; /* tb group parity error register */
- int mc5_cacherr; /* cache error register */
- int mc5_buserr; /* bus error register */
- int mc5_mcesr; /* machine check status register */
- int mc5_pc; /* trapped pc */
- int mc5_psl; /* trapped psl */
-};
-struct mc730frame {
- int mc3_bcnt; /* byte count == 0xc */
- int mc3_summary; /* summary parameter */
- int mc3_parm[2]; /* parameter 1 and 2 */
- int mc3_pc; /* trapped pc */
- int mc3_psl; /* trapped psl */
-};
-struct mc630frame {
- int mc63_bcnt; /* byte count == 0xc */
- int mc63_summary; /* summary parameter */
- int mc63_mrvaddr; /* most recent vad */
- int mc63_istate; /* internal state */
- int mc63_pc; /* trapped pc */
- int mc63_psl; /* trapped psl */
-};
-struct mc8600frame {
- int mc6_bcnt; /* byte count == 0x58 */
- int mc6_ehmsts;
- int mc6_evmqsav;
- int mc6_ebcs;
- int mc6_edpsr;
- int mc6_cslint;
- int mc6_ibesr;
- int mc6_ebxwd1;
- int mc6_ebxwd2;
- int mc6_ivasav;
- int mc6_vibasav;
- int mc6_esasav;
- int mc6_isasav;
- int mc6_cpc;
- int mc6_mstat1;
- int mc6_mstat2;
- int mc6_mdecc;
- int mc6_merg;
- int mc6_cshctl;
- int mc6_mear;
- int mc6_medr;
- int mc6_accs;
- int mc6_cses;
- int mc6_pc; /* trapped pc */
- int mc6_psl; /* trapped psl */
-};
-
-machinecheck(cmcf)
- caddr_t cmcf;
-{
- register u_int type = ((struct mc780frame *)cmcf)->mc8_summary;
-
- printf("machine check %x: ", type);
- switch (cpu) {
-#if VAX8600
- case VAX_8600: {
- register struct mc8600frame *mcf = (struct mc8600frame *)cmcf;
-
- if (mcf->mc6_ebcs & MBOX_FE)
- mcf->mc6_ehmsts |= MC_MBOX;
- else if (mcf->mc6_ehmsts & FBOX_SERV)
- mcf->mc6_ehmsts |= MC_FBOX;
- else if (mcf->mc6_ebcs & EBOX_ERR) {
- if (mcf->mc6_ebcs & EDP_PE)
- mcf->mc6_ehmsts |= MC_MBOX;
- else
- mcf->mc6_ehmsts |= MC_EBOX;
- } else if (mcf->mc6_ehmsts & IBOX_ERR)
- mcf->mc6_ehmsts |= MC_IBOX;
- else if (mcf->mc6_mstat1 & M8600_TB_ERR)
- mcf->mc6_ehmsts |= MC_TBUF;
- else if ((mcf->mc6_cslint & MBOX_1D) == MBOX_1D)
- mcf->mc6_ehmsts |= MC_MBOX1D;
-
- type = mcf->mc6_ehmsts & 0x7;
- if (type < NMC8600)
- printf("machine check %x: %s", type, mc8600[type]);
- printf("\n");
- printf("\tehm.sts %x evmqsav %x ebcs %x edpsr %x cslint %x\n",
- mcf->mc6_ehmsts, mcf->mc6_evmqsav, mcf->mc6_ebcs,
- mcf->mc6_edpsr, mcf->mc6_cslint);
- printf("\tibesr %x ebxwd %x %x ivasav %x vibasav %x\n",
- mcf->mc6_ibesr, mcf->mc6_ebxwd1, mcf->mc6_ebxwd2,
- mcf->mc6_ivasav, mcf->mc6_vibasav);
- printf("\tesasav %x isasav %x cpc %x mstat %x %x mdecc %x\n",
- mcf->mc6_esasav, mcf->mc6_isasav, mcf->mc6_cpc,
- mcf->mc6_mstat1, mcf->mc6_mstat2, mcf->mc6_mdecc);
- printf("\tmerg %x cshctl %x mear %x medr %x accs %x cses %x\n",
- mcf->mc6_merg, mcf->mc6_cshctl, mcf->mc6_mear,
- mcf->mc6_medr, mcf->mc6_accs, mcf->mc6_cses);
- printf("\tpc %x psl %x\n", mcf->mc6_pc, mcf->mc6_psl);
- mtpr(EHSR, 0);
- break;
- };
-#endif
-#if VAX780
- case VAX_780: {
- register struct mc780frame *mcf = (struct mc780frame *)cmcf;
-
- register int sbifs;
- printf("%s%s\n", mc780[type&0xf],
- (type&0xf0) ? " abort" : " fault");
- printf("\tcpues %x upc %x va/viba %x dreg %x tber %x %x\n",
- mcf->mc8_cpues, mcf->mc8_upc, mcf->mc8_vaviba,
- mcf->mc8_dreg, mcf->mc8_tber0, mcf->mc8_tber1);
- sbifs = mfpr(SBIFS);
- printf("\ttimo %x parity %x sbier %x pc %x psl %x sbifs %x\n",
- mcf->mc8_timo*4, mcf->mc8_parity, mcf->mc8_sbier,
- mcf->mc8_pc, mcf->mc8_psl, sbifs);
- /* THE FUNNY BITS IN THE FOLLOWING ARE FROM THE ``BLACK */
- /* BOOK'' AND SHOULD BE PUT IN AN ``sbi.h'' */
- mtpr(SBIFS, sbifs &~ 0x2000000);
- mtpr(SBIER, mfpr(SBIER) | 0x70c0);
- break;
- }
-#endif
-#if VAX750
- case VAX_750: {
- register struct mc750frame *mcf = (struct mc750frame *)cmcf;
-
- int mcsr = mfpr(MCSR);
- printf("%s%s\n", mc780[type&0xf],
- (type&0xf0) ? " abort" : " fault");
- mtpr(TBIA, 0);
- mtpr(MCESR, 0xf);
- printf("\tva %x errpc %x mdr %x smr %x rdtimo %x tbgpar %x cacherr %x\n",
- mcf->mc5_va, mcf->mc5_errpc, mcf->mc5_mdr, mcf->mc5_svmode,
- mcf->mc5_rdtimo, mcf->mc5_tbgpar, mcf->mc5_cacherr);
- printf("\tbuserr %x mcesr %x pc %x psl %x mcsr %x\n",
- mcf->mc5_buserr, mcf->mc5_mcesr, mcf->mc5_pc, mcf->mc5_psl,
- mcsr);
- if (type == MC750_TBERR && (mcf->mc5_mcesr&0xe) == MC750_TBPAR){
- printf("tbuf par: flushing and returning\n");
- return;
- }
- break;
- }
-#endif
-#if VAX730
- case VAX_730: {
- register struct mc730frame *mcf = (struct mc730frame *)cmcf;
-
- if (type < NMC730)
- printf("%s", mc730[type]);
- printf("\n");
- printf("params %x,%x pc %x psl %x mcesr %x\n",
- mcf->mc3_parm[0], mcf->mc3_parm[1],
- mcf->mc3_pc, mcf->mc3_psl, mfpr(MCESR));
- mtpr(MCESR, 0xf);
- break;
- }