Annotation of 42BSD/sys/vax/machdep.c, revision 1.1

1.1     ! root        1: /*     machdep.c       6.2     83/10/02        */
        !             2: 
        !             3: #include "../machine/reg.h"
        !             4: #include "../machine/pte.h"
        !             5: #include "../machine/psl.h"
        !             6: 
        !             7: #include "../h/param.h"
        !             8: #include "../h/systm.h"
        !             9: #include "../h/dir.h"
        !            10: #include "../h/user.h"
        !            11: #include "../h/kernel.h"
        !            12: #include "../h/map.h"
        !            13: #include "../h/vm.h"
        !            14: #include "../h/proc.h"
        !            15: #include "../h/buf.h"
        !            16: #include "../h/reboot.h"
        !            17: #include "../h/conf.h"
        !            18: #include "../h/inode.h"
        !            19: #include "../h/file.h"
        !            20: #include "../h/text.h"
        !            21: #include "../h/clist.h"
        !            22: #include "../h/callout.h"
        !            23: #include "../h/cmap.h"
        !            24: #include "../h/mbuf.h"
        !            25: #include "../h/msgbuf.h"
        !            26: #include "../h/quota.h"
        !            27: 
        !            28: #include "../vax/frame.h"
        !            29: #include "../vax/cons.h"
        !            30: #include "../vax/cpu.h"
        !            31: #include "../vax/mem.h"
        !            32: #include "../vax/mtpr.h"
        !            33: #include "../vax/rpb.h"
        !            34: #include "../vaxuba/ubavar.h"
        !            35: #include "../vaxuba/ubareg.h"
        !            36: 
        !            37: int    icode[] =
        !            38: {
        !            39:        0x9f19af9f,     /* pushab [&"init",0]; pushab */
        !            40:        0x02dd09af,     /* "/etc/init"; pushl $2 */
        !            41:        0xbc5c5ed0,     /* movl sp,ap; chmk */
        !            42:        0x2ffe110b,     /* $exec; brb .; "/ */
        !            43:        0x2f637465,     /* etc/ */
        !            44:        0x74696e69,     /* init" */
        !            45:        0x00000000,     /* \0\0\0";  0 */
        !            46:        0x00000014,     /* [&"init", */
        !            47:        0x00000000,     /* 0] */
        !            48: };
        !            49: int    szicode = sizeof(icode);
        !            50: 
        !            51: /*
        !            52:  * Declare these as initialized data so we can patch them.
        !            53:  */
        !            54: int    nbuf = 0;
        !            55: int    nswbuf = 0;
        !            56: int    bufpages = 0;
        !            57: 
        !            58: /*
        !            59:  * Machine-dependent startup code
        !            60:  */
        !            61: startup(firstaddr)
        !            62:        int firstaddr;
        !            63: {
        !            64:        register int unixsize;
        !            65:        register unsigned i;
        !            66:        register struct pte *pte;
        !            67:        int mapaddr, j;
        !            68:        register caddr_t v;
        !            69:        int maxbufs, base, residual;
        !            70:        extern char etext;
        !            71: 
        !            72:        /*
        !            73:         * Initialize error message buffer (at end of core).
        !            74:         */
        !            75:        maxmem -= btoc(sizeof (struct msgbuf));
        !            76:        pte = msgbufmap;
        !            77:        for (i = 0; i < btoc(sizeof (struct msgbuf)); i++)
        !            78:                *(int *)pte++ = PG_V | PG_KW | (maxmem + i);
        !            79:        mtpr(TBIA, 1);
        !            80: 
        !            81:        /*
        !            82:         * Good {morning,afternoon,evening,night}.
        !            83:         */
        !            84:        printf(version);
        !            85:        printf("real mem  = %d\n", ctob(maxmem));
        !            86:        
        !            87:        /*
        !            88:         * Determine how many buffers to allocate.
        !            89:         * Use 10% of memory, with min of 16.
        !            90:         * We allocate 1/2 as many swap buffer headers as file i/o buffers.
        !            91:         */
        !            92:        maxbufs = ((SYSPTSIZE * NBPG) - (5 * (int)(&etext - 0x80000000))) /
        !            93:            MAXBSIZE;
        !            94:        if (bufpages == 0)
        !            95:                bufpages = (physmem * NBPG) / 10 / CLBYTES;
        !            96:        if (nbuf == 0) {
        !            97:                nbuf = bufpages / 2;
        !            98:                if (nbuf < 16)
        !            99:                        nbuf = 16;
        !           100:                if (nbuf > maxbufs)
        !           101:                        nbuf = maxbufs;
        !           102:        }
        !           103:        if (bufpages > nbuf * (MAXBSIZE / CLBYTES))
        !           104:                bufpages = nbuf * (MAXBSIZE / CLBYTES);
        !           105:        if (nswbuf == 0) {
        !           106:                nswbuf = (nbuf / 2) &~ 1;       /* force even */
        !           107:                if (nswbuf > 256)
        !           108:                        nswbuf = 256;           /* sanity */
        !           109:        }
        !           110: 
        !           111:        /*
        !           112:         * Allocate space for system data structures.
        !           113:         * The first available real memory address is in "firstaddr".
        !           114:         * As pages of memory are allocated, "firstaddr" is incremented.
        !           115:         * The first available kernel virtual address is in "v".
        !           116:         * As pages of kernel virtual memory are allocated, "v" is incremented.
        !           117:         * An index into the kernel page table corresponding to the
        !           118:         * virtual memory address maintained in "v" is kept in "mapaddr".
        !           119:         */
        !           120:        mapaddr = firstaddr;
        !           121:        v = (caddr_t)(0x80000000 | (firstaddr * NBPG));
        !           122: #define        valloc(name, type, num) \
        !           123:            (name) = (type *)(v); (v) = (caddr_t)((name)+(num))
        !           124: #define        valloclim(name, type, num, lim) \
        !           125:            (name) = (type *)(v); (v) = (caddr_t)((lim) = ((name)+(num)))
        !           126:        valloc(buffers, char, MAXBSIZE * nbuf);
        !           127:        base = bufpages / nbuf;
        !           128:        residual = bufpages % nbuf;
        !           129:        for (i = 0; i < residual; i++) {
        !           130:                for (j = 0; j < (base + 1) * CLSIZE; j++) {
        !           131:                        *(int *)(&Sysmap[mapaddr+j]) = PG_V | PG_KW | firstaddr;
        !           132:                        clearseg((unsigned)firstaddr);
        !           133:                        firstaddr++;
        !           134:                }
        !           135:                mapaddr += MAXBSIZE / NBPG;
        !           136:        }
        !           137:        for (i = residual; i < nbuf; i++) {
        !           138:                for (j = 0; j < base * CLSIZE; j++) {
        !           139:                        *(int *)(&Sysmap[mapaddr+j]) = PG_V | PG_KW | firstaddr;
        !           140:                        clearseg((unsigned)firstaddr);
        !           141:                        firstaddr++;
        !           142:                }
        !           143:                mapaddr += MAXBSIZE / NBPG;
        !           144:        }
        !           145:        valloc(buf, struct buf, nbuf);
        !           146:        valloc(swbuf, struct buf, nswbuf);
        !           147:        valloclim(inode, struct inode, ninode, inodeNINODE);
        !           148:        valloclim(file, struct file, nfile, fileNFILE);
        !           149:        valloclim(proc, struct proc, nproc, procNPROC);
        !           150:        valloclim(text, struct text, ntext, textNTEXT);
        !           151:        valloc(cfree, struct cblock, nclist);
        !           152:        valloc(callout, struct callout, ncallout);
        !           153:        valloc(swapmap, struct map, nswapmap = nproc * 2);
        !           154:        valloc(argmap, struct map, ARGMAPSIZE);
        !           155:        valloc(kernelmap, struct map, nproc);
        !           156:        valloc(mbmap, struct map, nmbclusters/4);
        !           157: #ifdef QUOTA
        !           158:        valloclim(quota, struct quota, nquota, quotaNQUOTA);
        !           159:        valloclim(dquot, struct dquot, ndquot, dquotNDQUOT);
        !           160: #endif
        !           161:        /*
        !           162:         * Now allocate space for core map
        !           163:         * Allow space for all of phsical memory minus the amount 
        !           164:         * dedicated to the system. The amount of physical memory
        !           165:         * dedicated to the system is the total virtual memory of
        !           166:         * the system minus the space in the buffers which is not
        !           167:         * allocated real memory.
        !           168:         */
        !           169:        ncmap = (physmem*NBPG - ((int)v &~ 0x80000000) +
        !           170:                (nbuf * (MAXBSIZE - 2 * CLBYTES))) /
        !           171:                    (NBPG*CLSIZE + sizeof (struct cmap));
        !           172:        valloclim(cmap, struct cmap, ncmap, ecmap);
        !           173:        if ((((int)(ecmap+1))&~0x80000000) > SYSPTSIZE*NBPG)
        !           174:                panic("sys pt too small");
        !           175: 
        !           176:        /*
        !           177:         * Clear allocated space, and make r/w entries
        !           178:         * for the space in the kernel map.
        !           179:         */
        !           180:        unixsize = btoc((int)(ecmap+1) &~ 0x80000000);
        !           181:        for (i = mapaddr; i < unixsize; i++) {
        !           182:                *(int *)(&Sysmap[i]) = PG_V | PG_KW | firstaddr;
        !           183:                clearseg((unsigned)firstaddr);
        !           184:                firstaddr++;
        !           185:        }
        !           186:        if (firstaddr >= physmem - 8*UPAGES)
        !           187:                panic("no memory");
        !           188:        mtpr(TBIA, 1);
        !           189: 
        !           190:        /*
        !           191:         * Initialize callouts
        !           192:         */
        !           193:        callfree = callout;
        !           194:        for (i = 1; i < ncallout; i++)
        !           195:                callout[i-1].c_next = &callout[i];
        !           196: 
        !           197:        /*
        !           198:         * Initialize memory allocator and swap
        !           199:         * and user page table maps.
        !           200:         *
        !           201:         * THE USER PAGE TABLE MAP IS CALLED ``kernelmap''
        !           202:         * WHICH IS A VERY UNDESCRIPTIVE AND INCONSISTENT NAME.
        !           203:         */
        !           204:        meminit(firstaddr, maxmem);
        !           205:        maxmem = freemem;
        !           206:        printf("avail mem = %d\n", ctob(maxmem));
        !           207:        printf("using %d buffers containing %d bytes of memory\n",
        !           208:                nbuf, bufpages * CLBYTES);
        !           209:        rminit(kernelmap, (long)USRPTSIZE, (long)1,
        !           210:            "usrpt", nproc);
        !           211:        rminit(mbmap, (long)((nmbclusters - 1) * CLSIZE), (long)CLSIZE,
        !           212:            "mbclusters", nmbclusters/4);
        !           213: 
        !           214:        /*
        !           215:         * Configure the system.
        !           216:         */
        !           217:        configure();
        !           218: 
        !           219:        /*
        !           220:         * Clear restart inhibit flags.
        !           221:         */
        !           222:        tocons(TXDB_CWSI);
        !           223:        tocons(TXDB_CCSI);
        !           224: }
        !           225: 
        !           226: #ifdef PGINPROF
        !           227: /*
        !           228:  * Return the difference (in microseconds)
        !           229:  * between the  current time and a previous
        !           230:  * time as represented  by the arguments.
        !           231:  * If there is a pending clock interrupt
        !           232:  * which has not been serviced due to high
        !           233:  * ipl, return error code.
        !           234:  */
        !           235: vmtime(otime, olbolt, oicr)
        !           236:        register int otime, olbolt, oicr;
        !           237: {
        !           238: 
        !           239:        if (mfpr(ICCS)&ICCS_INT)
        !           240:                return(-1);
        !           241:        else
        !           242:                return(((time.tv_sec-otime)*60 + lbolt-olbolt)*16667 + mfpr(ICR)-oicr);
        !           243: }
        !           244: #endif
        !           245: 
        !           246: /*
        !           247:  * Send an interrupt to process.
        !           248:  *
        !           249:  * Stack is set up to allow sigcode stored
        !           250:  * in u. to call routine, followed by chmk
        !           251:  * to sigcleanup routine below.  After sigcleanup
        !           252:  * resets the signal mask and the stack, it
        !           253:  * returns to user who then unwinds with the
        !           254:  * rei at the bottom of sigcode.
        !           255:  */
        !           256: sendsig(p, sig, sigmask)
        !           257:        int (*p)(), sig, sigmask;
        !           258: {
        !           259:        register struct sigcontext *scp;        /* know to be r11 */
        !           260:        register int *regs;
        !           261:        register struct sigframe {
        !           262:                int     sf_signum;
        !           263:                int     sf_code;
        !           264:                struct  sigcontext *sf_scp;
        !           265:                int     (*sf_handler)();
        !           266:                struct  sigcontext *sf_scpcopy;
        !           267:        } *fp;                                  /* known to be r9 */
        !           268:        int oonstack;
        !           269: 
        !           270:        regs = u.u_ar0;
        !           271:        oonstack = u.u_onstack;
        !           272:        scp = (struct sigcontext *)regs[SP] - 1;
        !           273: #define        mask(s) (1<<((s)-1))
        !           274:        if (!u.u_onstack && (u.u_sigonstack & mask(sig))) {
        !           275:                fp = (struct sigframe *)u.u_sigsp - 1;
        !           276:                u.u_onstack = 1;
        !           277:        } else
        !           278:                fp = (struct sigframe *)scp - 1;
        !           279:        /*
        !           280:         * Must build signal handler context on stack to be returned to
        !           281:         * so that rei instruction in sigcode will pop ps and pc
        !           282:         * off correct stack.  The remainder of the signal state
        !           283:         * used in calling the handler must be placed on the stack
        !           284:         * on which the handler is to operate so that the calls
        !           285:         * in sigcode will save the registers and such correctly.
        !           286:         */
        !           287:        if (!oonstack && (int)fp <= USRSTACK - ctob(u.u_ssize)) 
        !           288:                grow((unsigned)fp);
        !           289:        ;
        !           290: #ifndef lint
        !           291:        asm("probew $3,$20,(r9)");
        !           292:        asm("jeql bad");
        !           293: #else
        !           294:        if (useracc((caddr_t)fp, sizeof (struct sigframe), 1))
        !           295:                goto bad;
        !           296: #endif
        !           297:        if (!u.u_onstack && (int)scp <= USRSTACK - ctob(u.u_ssize))
        !           298:                grow((unsigned)scp);
        !           299:        ;                       /* Avoid asm() label botch */
        !           300: #ifndef lint
        !           301:        asm("probew $3,$20,(r11)");
        !           302:        asm("beql bad");
        !           303: #else
        !           304:        if (useracc((caddr_t)scp, sizeof (struct sigcontext), 1))
        !           305:                goto bad;
        !           306: #endif
        !           307:        fp->sf_signum = sig;
        !           308:        if (sig == SIGILL || sig == SIGFPE) {
        !           309:                fp->sf_code = u.u_code;
        !           310:                u.u_code = 0;
        !           311:        } else
        !           312:                fp->sf_code = 0;
        !           313:        fp->sf_scp = scp;
        !           314:        fp->sf_handler = p;
        !           315:        /*
        !           316:         * Duplicate the pointer to the sigcontext structure.
        !           317:         * This one doesn't get popped by the ret, and is used 
        !           318:         * by sigcleanup to reset the signal state on inward return.
        !           319:         */
        !           320:        fp->sf_scpcopy = scp;
        !           321:        /* sigcontext goes on previous stack */
        !           322:        scp->sc_onstack = oonstack;
        !           323:        scp->sc_mask = sigmask;
        !           324:        /* setup rei */
        !           325:        scp->sc_sp = (int)&scp->sc_pc;
        !           326:        scp->sc_pc = regs[PC];
        !           327:        scp->sc_ps = regs[PS];
        !           328:        regs[SP] = (int)fp;
        !           329:        regs[PS] &= ~(PSL_CM|PSL_FPD);
        !           330:        regs[PC] = (int)u.u_pcb.pcb_sigc;
        !           331:        return;
        !           332: 
        !           333: asm("bad:");
        !           334: bad:
        !           335:        /*
        !           336:         * Process has trashed its stack; give it an illegal
        !           337:         * instruction to halt it in its tracks.
        !           338:         */
        !           339:        u.u_signal[SIGILL] = SIG_DFL;
        !           340:        sig = mask(SIGILL);
        !           341:        u.u_procp->p_sigignore &= ~sig;
        !           342:        u.u_procp->p_sigcatch &= ~sig;
        !           343:        u.u_procp->p_sigmask &= ~sig;
        !           344:        psignal(u.u_procp, SIGILL);
        !           345: }
        !           346: 
        !           347: /*
        !           348:  * Routine to cleanup state after a signal
        !           349:  * has been taken.  Reset signal mask and
        !           350:  * stack state from context left by sendsig (above).
        !           351:  * Pop these values in preparation for rei which
        !           352:  * follows return from this routine.
        !           353:  */
        !           354: sigcleanup()
        !           355: {
        !           356:        register struct sigcontext *scp;
        !           357: 
        !           358:        scp = (struct sigcontext *)fuword((caddr_t)u.u_ar0[SP]);
        !           359:        if ((int)scp == -1)
        !           360:                return;
        !           361: #ifndef lint
        !           362:        /* only probe 12 here because that's all we need */
        !           363:        asm("prober $3,$12,(r11)");
        !           364:        asm("bnequ 1f; ret; 1:");
        !           365: #else
        !           366:        if (useracc((caddr_t)scp, sizeof (*scp), 0))
        !           367:                return;
        !           368: #endif
        !           369:        u.u_onstack = scp->sc_onstack & 01;
        !           370:        u.u_procp->p_sigmask =
        !           371:            scp->sc_mask &~ (mask(SIGKILL)|mask(SIGCONT)|mask(SIGSTOP));
        !           372:        u.u_ar0[SP] = scp->sc_sp;
        !           373: }
        !           374: #undef mask
        !           375: 
        !           376: #ifdef notdef
        !           377: dorti()
        !           378: {
        !           379:        struct frame frame;
        !           380:        register int sp;
        !           381:        register int reg, mask;
        !           382:        extern int ipcreg[];
        !           383: 
        !           384:        (void) copyin((caddr_t)u.u_ar0[FP], (caddr_t)&frame, sizeof (frame));
        !           385:        sp = u.u_ar0[FP] + sizeof (frame);
        !           386:        u.u_ar0[PC] = frame.fr_savpc;
        !           387:        u.u_ar0[FP] = frame.fr_savfp;
        !           388:        u.u_ar0[AP] = frame.fr_savap;
        !           389:        mask = frame.fr_mask;
        !           390:        for (reg = 0; reg <= 11; reg++) {
        !           391:                if (mask&1) {
        !           392:                        u.u_ar0[ipcreg[reg]] = fuword((caddr_t)sp);
        !           393:                        sp += 4;
        !           394:                }
        !           395:                mask >>= 1;
        !           396:        }
        !           397:        sp += frame.fr_spa;
        !           398:        u.u_ar0[PS] = (u.u_ar0[PS] & 0xffff0000) | frame.fr_psw;
        !           399:        if (frame.fr_s)
        !           400:                sp += 4 + 4 * (fuword((caddr_t)sp) & 0xff);
        !           401:        /* phew, now the rei */
        !           402:        u.u_ar0[PC] = fuword((caddr_t)sp);
        !           403:        sp += 4;
        !           404:        u.u_ar0[PS] = fuword((caddr_t)sp);
        !           405:        sp += 4;
        !           406:        u.u_ar0[PS] |= PSL_USERSET;
        !           407:        u.u_ar0[PS] &= ~PSL_USERCLR;
        !           408:        u.u_ar0[SP] = (int)sp;
        !           409: }
        !           410: #endif
        !           411: 
        !           412: /*
        !           413:  * Memenable enables the memory controlle corrected data reporting.
        !           414:  * This runs at regular intervals, turning on the interrupt.
        !           415:  * The interrupt is turned off, per memory controller, when error
        !           416:  * reporting occurs.  Thus we report at most once per memintvl.
        !           417:  */
        !           418: int    memintvl = MEMINTVL;
        !           419: 
        !           420: memenable()
        !           421: {
        !           422:        register struct mcr *mcr;
        !           423:        register int m;
        !           424: 
        !           425:        for (m = 0; m < nmcr; m++) {
        !           426:                mcr = mcraddr[m];
        !           427:                switch (cpu) {
        !           428: #if VAX780
        !           429:                case VAX_780:
        !           430:                        M780_ENA(mcr);
        !           431:                        break;
        !           432: #endif
        !           433: #if VAX750
        !           434:                case VAX_750:
        !           435:                        M750_ENA(mcr);
        !           436:                        break;
        !           437: #endif
        !           438: #if VAX730
        !           439:                case VAX_730:
        !           440:                        M730_ENA(mcr);
        !           441:                        break;
        !           442: #endif
        !           443:                }
        !           444:        }
        !           445:        if (memintvl > 0)
        !           446:                timeout(memenable, (caddr_t)0, memintvl*hz);
        !           447: }
        !           448: 
        !           449: /*
        !           450:  * Memerr is the interrupt routine for corrected read data
        !           451:  * interrupts.  It looks to see which memory controllers have
        !           452:  * unreported errors, reports them, and disables further
        !           453:  * reporting for a time on those controller.
        !           454:  */
        !           455: memerr()
        !           456: {
        !           457:        register struct mcr *mcr;
        !           458:        register int m;
        !           459: 
        !           460:        for (m = 0; m < nmcr; m++) {
        !           461:                mcr = mcraddr[m];
        !           462:                switch (cpu) {
        !           463: #if VAX780
        !           464:                case VAX_780:
        !           465:                        if (M780_ERR(mcr)) {
        !           466:                                printf("mcr%d: soft ecc addr %x syn %x\n",
        !           467:                                    m, M780_ADDR(mcr), M780_SYN(mcr));
        !           468: #ifdef TRENDATA
        !           469:                                memlog(m, mcr);
        !           470: #endif
        !           471:                                M780_INH(mcr);
        !           472:                        }
        !           473:                        break;
        !           474: #endif
        !           475: #if VAX750
        !           476:                case VAX_750:
        !           477:                        if (M750_ERR(mcr)) {
        !           478:                                struct mcr amcr;
        !           479:                                amcr.mc_reg[0] = mcr->mc_reg[0];
        !           480:                                printf("mcr%d: soft ecc addr %x syn %x\n",
        !           481:                                    m, M750_ADDR(&amcr), M750_SYN(&amcr));
        !           482:                                M750_INH(mcr);
        !           483:                        }
        !           484:                        break;
        !           485: #endif
        !           486: #if VAX730
        !           487:                case VAX_730: {
        !           488:                        register int mcreg = mcr->mc_reg[1];
        !           489: 
        !           490:                        if (mcreg & M730_CRD) {
        !           491:                                struct mcr amcr;
        !           492:                                amcr.mc_reg[0] = mcr->mc_reg[0];
        !           493:                                printf("mcr%d: soft ecc addr %x syn %x\n",
        !           494:                                    m, M730_ADDR(&amcr), M730_SYN(&amcr));
        !           495:                                M730_INH(mcr);
        !           496:                        }
        !           497:                        break;
        !           498:                }
        !           499: #endif
        !           500:                }
        !           501:        }
        !           502: }
        !           503: 
        !           504: #ifdef TRENDATA
        !           505: /*
        !           506:  * Figure out what chip to replace on Trendata boards.
        !           507:  * Assumes all your memory is Trendata or the non-Trendata
        !           508:  * memory never fails..
        !           509:  */
        !           510: struct {
        !           511:        u_char  m_syndrome;
        !           512:        char    m_chip[4];
        !           513: } memlogtab[] = {
        !           514:        0x01,   "C00",  0x02,   "C01",  0x04,   "C02",  0x08,   "C03",
        !           515:        0x10,   "C04",  0x19,   "L01",  0x1A,   "L02",  0x1C,   "L04",
        !           516:        0x1F,   "L07",  0x20,   "C05",  0x38,   "L00",  0x3B,   "L03",
        !           517:        0x3D,   "L05",  0x3E,   "L06",  0x40,   "C06",  0x49,   "L09",
        !           518:        0x4A,   "L10",  0x4c,   "L12",  0x4F,   "L15",  0x51,   "L17",
        !           519:        0x52,   "L18",  0x54,   "L20",  0x57,   "L23",  0x58,   "L24",
        !           520:        0x5B,   "L27",  0x5D,   "L29",  0x5E,   "L30",  0x68,   "L08",
        !           521:        0x6B,   "L11",  0x6D,   "L13",  0x6E,   "L14",  0x70,   "L16",
        !           522:        0x73,   "L19",  0x75,   "L21",  0x76,   "L22",  0x79,   "L25",
        !           523:        0x7A,   "L26",  0x7C,   "L28",  0x7F,   "L31",  0x80,   "C07",
        !           524:        0x89,   "U01",  0x8A,   "U02",  0x8C,   "U04",  0x8F,   "U07",
        !           525:        0x91,   "U09",  0x92,   "U10",  0x94,   "U12",  0x97,   "U15",
        !           526:        0x98,   "U16",  0x9B,   "U19",  0x9D,   "U21",  0x9E,   "U22",
        !           527:        0xA8,   "U00",  0xAB,   "U03",  0xAD,   "U05",  0xAE,   "U06",
        !           528:        0xB0,   "U08",  0xB3,   "U11",  0xB5,   "U13",  0xB6,   "U14",
        !           529:        0xB9,   "U17",  0xBA,   "U18",  0xBC,   "U20",  0xBF,   "U23",
        !           530:        0xC1,   "U25",  0xC2,   "U26",  0xC4,   "U28",  0xC7,   "U31",
        !           531:        0xE0,   "U24",  0xE3,   "U27",  0xE5,   "U29",  0xE6,   "U30"
        !           532: };
        !           533: 
        !           534: memlog (m, mcr)
        !           535:        int m;
        !           536:        struct mcr *mcr;
        !           537: {
        !           538:        register i;
        !           539: 
        !           540:        switch (cpu) {
        !           541: 
        !           542: #if VAX780
        !           543:        case VAX_780:
        !           544:        for (i = 0; i < (sizeof (memlogtab) / sizeof (memlogtab[0])); i++)
        !           545:                if ((u_char)(M780_SYN(mcr)) == memlogtab[i].m_syndrome) {
        !           546:                        printf (
        !           547:        "mcr%d: replace %s chip in %s bank of memory board %d (0-15)\n",
        !           548:                                m,
        !           549:                                memlogtab[i].m_chip,
        !           550:                                (M780_ADDR(mcr) & 0x8000) ? "upper" : "lower",
        !           551:                                (M780_ADDR(mcr) >> 16));
        !           552:                        return;
        !           553:                }
        !           554:        printf ("mcr%d: multiple errors, not traceable\n", m);
        !           555:        break;
        !           556: #endif
        !           557:        }
        !           558: }
        !           559: #endif
        !           560: 
        !           561: /*
        !           562:  * Invalidate single all pte's in a cluster
        !           563:  */
        !           564: tbiscl(v)
        !           565:        unsigned v;
        !           566: {
        !           567:        register caddr_t addr;          /* must be first reg var */
        !           568:        register int i;
        !           569: 
        !           570:        asm(".set TBIS,58");
        !           571:        addr = ptob(v);
        !           572:        for (i = 0; i < CLSIZE; i++) {
        !           573: #ifdef lint
        !           574:                mtpr(TBIS, addr);
        !           575: #else
        !           576:                asm("mtpr r11,$TBIS");
        !           577: #endif
        !           578:                addr += NBPG;
        !           579:        }
        !           580: }
        !           581:   
        !           582: int    waittime = -1;
        !           583: 
        !           584: boot(paniced, arghowto)
        !           585:        int paniced, arghowto;
        !           586: {
        !           587:        register int howto;             /* r11 == how to boot */
        !           588:        register int devtype;           /* r10 == major of root dev */
        !           589: 
        !           590: #ifdef lint
        !           591:        howto = 0; devtype = 0;
        !           592:        printf("howto %d, devtype %d\n", arghowto, devtype);
        !           593: #endif
        !           594:        (void) spl1();
        !           595:        howto = arghowto;
        !           596:        if ((howto&RB_NOSYNC)==0 && waittime < 0 && bfreelist[0].b_forw) {
        !           597:                waittime = 0;
        !           598:                update();
        !           599:                printf("syncing disks... ");
        !           600: #ifdef notdef
        !           601:                DELAY(10000000);
        !           602: #else
        !           603:                { register struct buf *bp;
        !           604:                  int iter, nbusy;
        !           605: 
        !           606:                  for (iter = 0; iter < 20; iter++) {
        !           607:                        nbusy = 0;
        !           608:                        for (bp = &buf[nbuf]; --bp >= buf; )
        !           609:                                if ((bp->b_flags & (B_BUSY|B_INVAL)) == B_BUSY)
        !           610:                                        nbusy++;
        !           611:                        if (nbusy == 0)
        !           612:                                break;
        !           613:                        printf("%d ", nbusy);
        !           614:                  }
        !           615:                }
        !           616: #endif
        !           617:                printf("done\n");
        !           618:        }
        !           619:        splx(0x1f);                     /* extreme priority */
        !           620:        devtype = major(rootdev);
        !           621:        if (howto&RB_HALT) {
        !           622:                printf("halting (in tight loop); hit\n\t^P\n\tHALT\n\n");
        !           623:                mtpr(IPL, 0x1f);
        !           624:                for (;;)
        !           625:                        ;
        !           626:        } else {
        !           627:                if (paniced == RB_PANIC) {
        !           628:                        doadump();              /* TXDB_BOOT's itsself */
        !           629:                        /*NOTREACHED*/
        !           630:                }
        !           631:                tocons(TXDB_BOOT);
        !           632:        }
        !           633: #if defined(VAX750) || defined(VAX730)
        !           634:        if (cpu != VAX_780)
        !           635:                { asm("movl r11,r5"); }         /* boot flags go in r5 */
        !           636: #endif
        !           637:        for (;;)
        !           638:                asm("halt");
        !           639:        /*NOTREACHED*/
        !           640: }
        !           641: 
        !           642: tocons(c)
        !           643: {
        !           644: 
        !           645:        while ((mfpr(TXCS)&TXCS_RDY) == 0)
        !           646:                continue;
        !           647:        mtpr(TXDB, c);
        !           648: }
        !           649: 
        !           650: int    dumpmag = 0x8fca0101;   /* magic number for savecore */
        !           651: int    dumpsize = 0;           /* also for savecore */
        !           652: /*
        !           653:  * Doadump comes here after turning off memory management and
        !           654:  * getting on the dump stack, either when called above, or by
        !           655:  * the auto-restart code.
        !           656:  */
        !           657: dumpsys()
        !           658: {
        !           659: 
        !           660:        rpb.rp_flag = 1;
        !           661: #ifdef notdef
        !           662:        if ((minor(dumpdev)&07) != 1)
        !           663:                return;
        !           664: #endif
        !           665:        dumpsize = physmem;
        !           666:        printf("\ndumping to dev %x, offset %d\n", dumpdev, dumplo);
        !           667:        printf("dump ");
        !           668:        switch ((*bdevsw[major(dumpdev)].d_dump)(dumpdev)) {
        !           669: 
        !           670:        case ENXIO:
        !           671:                printf("device bad\n");
        !           672:                break;
        !           673: 
        !           674:        case EFAULT:
        !           675:                printf("device not ready\n");
        !           676:                break;
        !           677: 
        !           678:        case EINVAL:
        !           679:                printf("area improper\n");
        !           680:                break;
        !           681: 
        !           682:        case EIO:
        !           683:                printf("i/o error");
        !           684:                break;
        !           685: 
        !           686:        default:
        !           687:                printf("succeeded");
        !           688:                break;
        !           689:        }
        !           690: }
        !           691: 
        !           692: /*
        !           693:  * Machine check error recovery code.
        !           694:  * Print out the machine check frame and then give up.
        !           695:  */
        !           696: #if defined(VAX780) || defined(VAX750)
        !           697: char *mc780[] = {
        !           698:        "cp read",      "ctrl str par", "cp tbuf par",  "cp cache par",
        !           699:        "cp rdtimo",    "cp rds",       "ucode lost",   0,
        !           700:        0,              0,              "ib tbuf par",  0,
        !           701:        "ib rds",       "ib rd timo",   0,              "ib cache par"
        !           702: };
        !           703: #define        MC750_TBPAR     4
        !           704: #endif
        !           705: #if VAX730
        !           706: #define        NMC730  12
        !           707: char *mc730[] = {
        !           708:        "tb par",       "bad retry",    "bad intr id",  "cant write ptem",
        !           709:        "unkn mcr err", "iib rd err",   "nxm ref",      "cp rds",
        !           710:        "unalgn ioref", "nonlw ioref",  "bad ioaddr",   "unalgn ubaddr",
        !           711: };
        !           712: #endif
        !           713: 
        !           714: /*
        !           715:  * Frame for each cpu
        !           716:  */
        !           717: struct mc780frame {
        !           718:        int     mc8_bcnt;               /* byte count == 0x28 */
        !           719:        int     mc8_summary;            /* summary parameter (as above) */
        !           720:        int     mc8_cpues;              /* cpu error status */
        !           721:        int     mc8_upc;                /* micro pc */
        !           722:        int     mc8_vaviba;             /* va/viba register */
        !           723:        int     mc8_dreg;               /* d register */
        !           724:        int     mc8_tber0;              /* tbuf error reg 0 */
        !           725:        int     mc8_tber1;              /* tbuf error reg 1 */
        !           726:        int     mc8_timo;               /* timeout address divided by 4 */
        !           727:        int     mc8_parity;             /* parity */
        !           728:        int     mc8_sbier;              /* sbi error register */
        !           729:        int     mc8_pc;                 /* trapped pc */
        !           730:        int     mc8_psl;                /* trapped psl */
        !           731: };
        !           732: struct mc750frame {
        !           733:        int     mc5_bcnt;               /* byte count == 0x28 */
        !           734:        int     mc5_summary;            /* summary parameter (as above) */
        !           735:        int     mc5_va;                 /* virtual address register */
        !           736:        int     mc5_errpc;              /* error pc */
        !           737:        int     mc5_mdr;
        !           738:        int     mc5_svmode;             /* saved mode register */
        !           739:        int     mc5_rdtimo;             /* read lock timeout */
        !           740:        int     mc5_tbgpar;             /* tb group parity error register */
        !           741:        int     mc5_cacherr;            /* cache error register */
        !           742:        int     mc5_buserr;             /* bus error register */
        !           743:        int     mc5_mcesr;              /* machine check status register */
        !           744:        int     mc5_pc;                 /* trapped pc */
        !           745:        int     mc5_psl;                /* trapped psl */
        !           746: };
        !           747: struct mc730frame {
        !           748:        int     mc3_bcnt;               /* byte count == 0xc */
        !           749:        int     mc3_summary;            /* summary parameter */
        !           750:        int     mc3_parm[2];            /* parameter 1 and 2 */
        !           751:        int     mc3_pc;                 /* trapped pc */
        !           752:        int     mc3_psl;                /* trapped psl */
        !           753: };
        !           754: 
        !           755: machinecheck(cmcf)
        !           756:        caddr_t cmcf;
        !           757: {
        !           758:        register u_int type = ((struct mc780frame *)cmcf)->mc8_summary;
        !           759: 
        !           760:        printf("machine check %x: ", type);
        !           761:        switch (cpu) {
        !           762: #if VAX780
        !           763:        case VAX_780:
        !           764: #endif
        !           765: #if VAX750
        !           766:        case VAX_750:
        !           767: #endif
        !           768: #if defined(VAX780) || defined(VAX750)
        !           769:                printf("%s%s\n", mc780[type&0xf],
        !           770:                    (type&0xf0) ? " abort" : " fault"); 
        !           771:                break;
        !           772: #endif
        !           773: #if VAX730
        !           774:        case VAX_730:
        !           775:                if (type < NMC730)
        !           776:                        printf("%s", mc730[type]);
        !           777:                printf("\n");
        !           778:                break;
        !           779: #endif
        !           780:        }
        !           781:        switch (cpu) {
        !           782: #if VAX780
        !           783:        case VAX_780: {
        !           784:                register struct mc780frame *mcf = (struct mc780frame *)cmcf;
        !           785:                register int sbifs;
        !           786:                printf("\tcpues %x upc %x va/viba %x dreg %x tber %x %x\n",
        !           787:                   mcf->mc8_cpues, mcf->mc8_upc, mcf->mc8_vaviba,
        !           788:                   mcf->mc8_dreg, mcf->mc8_tber0, mcf->mc8_tber1);
        !           789:                sbifs = mfpr(SBIFS);
        !           790:                printf("\ttimo %x parity %x sbier %x pc %x psl %x sbifs %x\n",
        !           791:                   mcf->mc8_timo*4, mcf->mc8_parity, mcf->mc8_sbier,
        !           792:                   mcf->mc8_pc, mcf->mc8_psl, sbifs);
        !           793:                /* THE FUNNY BITS IN THE FOLLOWING ARE FROM THE ``BLACK */
        !           794:                /* BOOK'' AND SHOULD BE PUT IN AN ``sbi.h'' */
        !           795:                mtpr(SBIFS, sbifs &~ 0x2000000);
        !           796:                mtpr(SBIER, mfpr(SBIER) | 0x70c0);
        !           797:                break;
        !           798:        }
        !           799: #endif
        !           800: #if VAX750
        !           801:        case VAX_750: {
        !           802:                register struct mc750frame *mcf = (struct mc750frame *)cmcf;
        !           803:                printf("\tva %x errpc %x mdr %x smr %x rdtimo %x tbgpar %x cacherr %x\n",
        !           804:                    mcf->mc5_va, mcf->mc5_errpc, mcf->mc5_mdr, mcf->mc5_svmode,
        !           805:                    mcf->mc5_rdtimo, mcf->mc5_tbgpar, mcf->mc5_cacherr);
        !           806:                printf("\tbuserr %x mcesr %x pc %x psl %x mcsr %x\n",
        !           807:                    mcf->mc5_buserr, mcf->mc5_mcesr, mcf->mc5_pc, mcf->mc5_psl,
        !           808:                    mfpr(MCSR));
        !           809:                mtpr(MCESR, 0xf);
        !           810:                if ((mcf->mc5_mcesr&0xf) == MC750_TBPAR) {
        !           811:                        printf("tbuf par: flushing and returning\n");
        !           812:                        mtpr(TBIA, 0);
        !           813:                        return;
        !           814:                }
        !           815:                break;
        !           816:                }
        !           817: #endif
        !           818: #if VAX730
        !           819:        case VAX_730: {
        !           820:                register struct mc730frame *mcf = (struct mc730frame *)cmcf;
        !           821:                printf("params %x,%x pc %x psl %x mcesr %x\n",
        !           822:                    mcf->mc3_parm[0], mcf->mc3_parm[1],
        !           823:                    mcf->mc3_pc, mcf->mc3_psl, mfpr(MCESR));
        !           824:                mtpr(MCESR, 0xf);
        !           825:                break;
        !           826:                }
        !           827: #endif
        !           828:        }
        !           829:        memerr();
        !           830:        panic("mchk");
        !           831: }
        !           832: 
        !           833: #ifdef notdef
        !           834: microtime(tvp)
        !           835:        struct timeval *tvp;
        !           836: {
        !           837:        int s = spl7();
        !           838: 
        !           839:        tvp->tv_sec = time.tv_sec;
        !           840:        tvp->tv_usec = (lbolt+1)*16667 + mfpr(ICR);
        !           841:        while (tvp->tv_usec > 1000000) {
        !           842:                tvp->tv_sec++;
        !           843:                tvp->tv_usec -= 1000000;
        !           844:        }
        !           845:        splx(s);
        !           846: }
        !           847: #endif
        !           848: 
        !           849: physstrat(bp, strat, prio)
        !           850:        struct buf *bp;
        !           851:        int (*strat)(), prio;
        !           852: {
        !           853:        int s;
        !           854: 
        !           855:        (*strat)(bp);
        !           856:        /* pageout daemon doesn't wait for pushed pages */
        !           857:        if (bp->b_flags & B_DIRTY)
        !           858:                return;
        !           859:        s = spl6();
        !           860:        while ((bp->b_flags & B_DONE) == 0)
        !           861:                sleep((caddr_t)bp, prio);
        !           862:        splx(s);
        !           863: }

unix.superglobalmegacorp.com

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