Annotation of 43BSDTahoe/sys/vax/ka860.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1986, 1988 Regents of the University of California.
                      3:  * All rights reserved.
                      4:  *
                      5:  * Redistribution and use in source and binary forms are permitted
                      6:  * provided that the above copyright notice and this paragraph are
                      7:  * duplicated in all such forms and that any documentation,
                      8:  * advertising materials, and other materials related to such
                      9:  * distribution and use acknowledge that the software was developed
                     10:  * by the University of California, Berkeley.  The name of the
                     11:  * University may not be used to endorse or promote products derived
                     12:  * from this software without specific prior written permission.
                     13:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
                     14:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
                     15:  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     16:  *
                     17:  *     @(#)ka860.c     7.2 (Berkeley) 7/9/88
                     18:  */
                     19: 
                     20: #if VAX8600
                     21: 
                     22: /*
                     23:  * VAX 8600 specific routines.
                     24:  */
                     25: 
                     26: #include "param.h"
                     27: 
                     28: #include "cpu.h"
                     29: #include "mtpr.h"
                     30: 
                     31: /*
                     32:  * 8600 memory register (MERG) bit definitions
                     33:  */
                     34: #define        M8600_ICRD      0x400           /* inhibit crd interrupts */
                     35: #define M8600_TB_ERR   0xf00           /* translation buffer error mask */
                     36: 
                     37: /*
                     38:  * MDECC register
                     39:  */
                     40: #define        M8600_ADDR_PE   0x080000        /* address parity error */
                     41: #define M8600_DBL_ERR  0x100000        /* data double bit error */
                     42: #define        M8600_SNG_ERR   0x200000        /* data single bit error */
                     43: #define        M8600_BDT_ERR   0x400000        /* bad data error */
                     44: 
                     45: /*
                     46:  * ESPA register is used to address scratch pad registers in the Ebox.
                     47:  * To access a register in the scratch pad, write the ESPA with the address
                     48:  * and then read the ESPD register.  
                     49:  *
                     50:  * NOTE:  In assmebly code, the mfpr instruction that reads the ESPD
                     51:  *       register must immedately follow the mtpr instruction that setup
                     52:  *       the ESPA register -- per the VENUS processor register spec.
                     53:  *
                     54:  * The scratchpad registers that are supplied for a single bit ECC 
                     55:  * error are:
                     56:  */
                     57: #define        SPAD_MSTAT1     0x25            /* scratch pad mstat1 register  */
                     58: #define SPAD_MSTAT2    0x26            /* scratch pad mstat2 register  */
                     59: #define SPAD_MDECC     0x27            /* scratch pad mdecc register   */
                     60: #define SPAD_MEAR      0x2a            /* scratch pad mear register    */
                     61: 
                     62: #define M8600_MEMERR(mdecc) ((mdecc) & 0x780000)
                     63: #define M8600_HRDERR(mdecc) ((mdecc) & 0x580000)
                     64: #define M8600_SYN(mdecc) (((mdecc) >> 9) & 0x3f)
                     65: #define M8600_ADDR(mear) ((mear) & 0x3ffffffc)
                     66: #define M8600_ARRAY(mear) (((mear) >> 22) & 0x0f)
                     67: 
                     68: #define M8600_MDECC_BITS \
                     69: "\20\27BAD_DT_ERR\26SNG_BIT_ERR\25DBL_BIT_ERR\24ADDR_PE"
                     70: 
                     71: #define M8600_MSTAT1_BITS "\20\30CPR_PE_A\27CPR_PE_B\26ABUS_DT_PE\
                     72: \25ABUS_CTL_MSK_PE\24ABUS_ADR_PE\23ABUS_C/A_CYCLE\22ABUS_ADP_1\21ABUS_ADP_0\
                     73: \20TB_MISS\17BLK_HIT\16C0_TAG_MISS\15CHE_MISS\14TB_VAL_ERR\13TB_PTE_B_PE\
                     74: \12TB_PTE_A_PE\11TB_TAG_PE\10WR_DT_PE_B3\7WR_DT_PE_B2\6WR_DT_PE_B1\
                     75: \5WR_DT_PE_B0\4CHE_RD_DT_PE\3CHE_SEL\2ANY_REFL\1CP_BW_CHE_DT_PE"
                     76: 
                     77: #define M8600_MSTAT2_BITS "\20\20CP_BYT_WR\17ABUS_BD_DT_CODE\10MULT_ERR\
                     78: \7CHE_TAG_PE\6CHE_TAG_W_PE\5CHE_WRTN_BIT\4NXM\3CP-IO_BUF_ERR\2MBOX_LOCK"
                     79: 
                     80: /* enable CRD reports */
                     81: ka860_memenable()
                     82: {
                     83: 
                     84:        mtpr(MERG, mfpr(MERG) & ~M8600_ICRD);
                     85: }
                     86: 
                     87: /* log CRD errors */
                     88: ka860_memerr()
                     89: {
                     90:        register int reg11;     /* known to be r11 below */
                     91:        int mdecc, mear, mstat1, mstat2, array;
                     92: 
                     93:        /*
                     94:         * Scratchpad registers in the Ebox must be read by
                     95:         * storing their ID number in ESPA and then immediately
                     96:         * reading ESPD's contents with no other intervening
                     97:         * machine instructions!
                     98:         *
                     99:         * The asm's below have a number of constants which
                    100:         * are defined correctly above and in mtpr.h.
                    101:         */
                    102: #ifdef lint
                    103:        reg11 = 0;
                    104: #else
                    105:        asm("mtpr $0x27,$0x4e; mfpr $0x4f,r11");
                    106: #endif
                    107:        mdecc = reg11;  /* must acknowledge interrupt? */
                    108:        if (M8600_MEMERR(mdecc)) {
                    109:                asm("mtpr $0x2a,$0x4e; mfpr $0x4f,r11");
                    110:                mear = reg11;
                    111:                asm("mtpr $0x25,$0x4e; mfpr $0x4f,r11");
                    112:                mstat1 = reg11;
                    113:                asm("mtpr $0x26,$0x4e; mfpr $0x4f,r11");
                    114:                mstat2 = reg11;
                    115:                array = M8600_ARRAY(mear);
                    116: 
                    117:                printf("mcr0: ecc error, addr %x (array %d) syn %x\n",
                    118:                        M8600_ADDR(mear), array, M8600_SYN(mdecc));
                    119:                printf("\tMSTAT1 = %b\n\tMSTAT2 = %b\n",
                    120:                            mstat1, M8600_MSTAT1_BITS,
                    121:                            mstat2, M8600_MSTAT2_BITS);
                    122:                mtpr(EHSR, 0);
                    123:                mtpr(MERG, mfpr(MERG) | M8600_ICRD);
                    124:        }
                    125: }
                    126: 
                    127: #define NMC8600        7
                    128: char *mc8600[] = {
                    129:        "unkn type",    "fbox error",   "ebox error",   "ibox error",
                    130:        "mbox error",   "tbuf error",   "mbox 1D error"
                    131: };
                    132: /* codes for above */
                    133: #define        MC_FBOX         1
                    134: #define        MC_EBOX         2
                    135: #define        MC_IBOX         3
                    136: #define        MC_MBOX         4
                    137: #define        MC_TBUF         5
                    138: #define        MC_MBOX1D       6
                    139: 
                    140: /* error bits */
                    141: #define        MBOX_FE         0x8000          /* Mbox fatal error */
                    142: #define        FBOX_SERV       0x10000000      /* Fbox service error */
                    143: #define        IBOX_ERR        0x2000          /* Ibox error */
                    144: #define        EBOX_ERR        0x1e00          /* Ebox error */
                    145: #define        MBOX_1D         0x81d0000       /* Mbox 1D error */
                    146: #define EDP_PE         0x200
                    147: 
                    148: struct mc8600frame {
                    149:        int     mc86_bcnt;              /* byte count == 0x58 */
                    150:        int     mc86_ehmsts;
                    151:        int     mc86_evmqsav;
                    152:        int     mc86_ebcs;
                    153:        int     mc86_edpsr;
                    154:        int     mc86_cslint;
                    155:        int     mc86_ibesr;
                    156:        int     mc86_ebxwd1;
                    157:        int     mc86_ebxwd2;
                    158:        int     mc86_ivasav;
                    159:        int     mc86_vibasav;
                    160:        int     mc86_esasav;
                    161:        int     mc86_isasav;
                    162:        int     mc86_cpc;
                    163:        int     mc86_mstat1;
                    164:        int     mc86_mstat2;
                    165:        int     mc86_mdecc;
                    166:        int     mc86_merg;
                    167:        int     mc86_cshctl;
                    168:        int     mc86_mear;
                    169:        int     mc86_medr;
                    170:        int     mc86_accs;
                    171:        int     mc86_cses;
                    172:        int     mc86_pc;                /* trapped pc */
                    173:        int     mc86_psl;               /* trapped psl */
                    174: };
                    175: 
                    176: /* machine check */
                    177: ka860_mchk(cmcf)
                    178:        caddr_t cmcf;
                    179: {
                    180:        register struct mc8600frame *mcf = (struct mc8600frame *)cmcf;
                    181:        register int type;
                    182: 
                    183:        if (mcf->mc86_ebcs & MBOX_FE)
                    184:                mcf->mc86_ehmsts |= MC_MBOX;
                    185:        else if (mcf->mc86_ehmsts & FBOX_SERV)
                    186:                mcf->mc86_ehmsts |= MC_FBOX;
                    187:        else if (mcf->mc86_ebcs & EBOX_ERR) {
                    188:                if (mcf->mc86_ebcs & EDP_PE)
                    189:                        mcf->mc86_ehmsts |= MC_MBOX;
                    190:                else
                    191:                        mcf->mc86_ehmsts |= MC_EBOX;
                    192:        } else if (mcf->mc86_ehmsts & IBOX_ERR)
                    193:                mcf->mc86_ehmsts |= MC_IBOX;
                    194:        else if (mcf->mc86_mstat1 & M8600_TB_ERR)
                    195:                mcf->mc86_ehmsts |= MC_TBUF;
                    196:        else if ((mcf->mc86_cslint & MBOX_1D) == MBOX_1D)
                    197:                mcf->mc86_ehmsts |= MC_MBOX1D;
                    198: 
                    199:        type = mcf->mc86_ehmsts & 0x7;
                    200:        printf("machine check %x: %s\n", type,
                    201:            type < NMC8600 ? mc8600[type] : "???");
                    202:        printf("\tehm.sts %x evmqsav %x ebcs %x edpsr %x cslint %x\n",
                    203:            mcf->mc86_ehmsts, mcf->mc86_evmqsav, mcf->mc86_ebcs,
                    204:            mcf->mc86_edpsr, mcf->mc86_cslint);
                    205:        printf("\tibesr %x ebxwd %x %x ivasav %x vibasav %x\n",
                    206:            mcf->mc86_ibesr, mcf->mc86_ebxwd1, mcf->mc86_ebxwd2,
                    207:            mcf->mc86_ivasav, mcf->mc86_vibasav);
                    208:        printf("\tesasav %x isasav %x cpc %x mstat %x %x mdecc %x\n",
                    209:            mcf->mc86_esasav, mcf->mc86_isasav, mcf->mc86_cpc,
                    210:            mcf->mc86_mstat1, mcf->mc86_mstat2, mcf->mc86_mdecc);
                    211:        printf("\tmerg %x cshctl %x mear %x medr %x accs %x cses %x\n",
                    212:            mcf->mc86_merg, mcf->mc86_cshctl, mcf->mc86_mear,
                    213:            mcf->mc86_medr, mcf->mc86_accs, mcf->mc86_cses);
                    214:        printf("\tpc %x psl %x\n", mcf->mc86_pc, mcf->mc86_psl);
                    215:        mtpr(EHSR, 0);
                    216:        return (MCHK_PANIC);
                    217: }
                    218: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.