Annotation of 40BSD/sys/dev/mba.c, revision 1.1.1.1

1.1       root        1: /*     mba.c   4.2     11/9/80 */
                      2: 
                      3: #include "../h/param.h"
                      4: #include "../h/buf.h"
                      5: #include "../h/conf.h"
                      6: #include "../h/systm.h"
                      7: #include "../h/dir.h"
                      8: #include "../h/user.h"
                      9: #include "../h/proc.h"
                     10: #include "../h/seg.h"
                     11: #include "../h/pte.h"
                     12: #include "../h/map.h"
                     13: #include "../h/mba.h"
                     14: #include "../h/mtpr.h"
                     15: #include "../h/vm.h"
                     16: 
                     17: /*
                     18:  * startup routine for MBA controllers.
                     19:  */
                     20: #define        MBAWCOM 0x30
                     21: #define        MBARCOM 0x38
                     22: #define        GO      01
                     23: 
                     24: mbastart(bp, adcr)
                     25:        register struct buf *bp;
                     26:        int *adcr;
                     27: {
                     28:        register int i;
                     29:        int npf;
                     30:        unsigned v;
                     31:        register struct pte *pte, *io;
                     32:        int o;
                     33:        int vaddr;
                     34:        register struct mba_regs *mbap;
                     35:        struct proc *rp;
                     36: 
                     37:        mbap = mbainfo[mbanum[major(bp->b_dev)]].mi_loc;
                     38:        io = mbap->mba_map;
                     39:        v = btop(bp->b_un.b_addr);
                     40:        o = (int)bp->b_un.b_addr & PGOFSET;
                     41:        npf = btoc(bp->b_bcount + o);
                     42:        rp = bp->b_flags&B_DIRTY ? &proc[2] : bp->b_proc;
                     43:        vaddr = o;
                     44:        if (bp->b_flags & B_UAREA) {
                     45:                for (i = 0; i < UPAGES; i++) {
                     46:                        if (rp->p_addr[i].pg_pfnum == 0)
                     47:                                panic("mba: zero upage");
                     48:                        *(int *)io++ = rp->p_addr[i].pg_pfnum | PG_V;
                     49:                }
                     50:        } else if ((bp->b_flags & B_PHYS) == 0) {
                     51:                pte = &Sysmap[btop(((int)bp->b_un.b_addr)&0x7fffffff)];
                     52:                while (--npf >= 0)
                     53:                        *(int *)io++ = pte++->pg_pfnum | PG_V;
                     54:        } else {
                     55:                if (bp->b_flags & B_PAGET)
                     56:                        pte = &Usrptmap[btokmx((struct pte *)bp->b_un.b_addr)];
                     57:                else
                     58:                        pte = vtopte(rp, v);
                     59:                while (--npf >= 0) {
                     60:                        if (pte->pg_pfnum == 0)
                     61:                                panic("mba, zero entry");
                     62:                        *(int *)io++ = pte++->pg_pfnum | PG_V;
                     63:                }
                     64:        }
                     65:        *(int *)io++ = 0;
                     66:        mbap->mba_sr = -1;      /* clear status (error) bits */
                     67:        mbap->mba_bcr = -bp->b_bcount;
                     68:        mbap->mba_var = vaddr;
                     69:        if (bp->b_flags & B_READ)
                     70:                *adcr = MBARCOM | GO;
                     71:        else
                     72:                *adcr = MBAWCOM | GO;
                     73: }
                     74: 
                     75: mbainit(mbano)
                     76:        int mbano;
                     77: {
                     78:        register struct pte *b;
                     79:        register int i;
                     80:        register struct mba_info *mi;
                     81:        register struct mba_regs *mbap;
                     82:        unsigned v;
                     83: 
                     84:        mi = &mbainfo[mbano];
                     85:        v = btop((int)mi->mi_phys);
                     86:        b = mi->mi_map;
                     87:        for (i = 0; i < 8192; i += NBPG) {
                     88:                *(int *)b++ = PG_V | PG_KW | v;
                     89:                mtpr(TBIS, ptob(v));
                     90:                v++;
                     91:        }
                     92:        mbap = mi->mi_loc;
                     93:        mbap->mba_cr = MBAINIT;
                     94:        mbap->mba_cr = MBAIE;
                     95:        mbaact |= (1<<mbano);
                     96: }

unix.superglobalmegacorp.com

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