|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.