fixed problem with sizeof MsgId == 0
[unix-history] / usr / src / sys / vax / mba / mba.c
CommitLineData
da1392b6 1/* mba.c 3.5 %G% */
b5ad10c3
BJ
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
80e7c811 24extern char buffers[NBUF][BSIZE];
b5ad10c3
BJ
25
26mbastart(bp, adcr)
80e7c811
BJ
27 register struct buf *bp;
28 int *adcr;
b5ad10c3
BJ
29{
30 register int i;
31 int npf;
32 unsigned v;
33 register struct pte *pte, *io;
34 int o;
35 int vaddr;
36 register struct mba_regs *mbap;
37 struct proc *rp;
b5ad10c3 38
80e7c811 39 mbap = mbainfo[mbanum[major(bp->b_dev)]].mi_loc;
b5ad10c3 40 if ((bp->b_flags & B_PHYS) == 0)
80e7c811 41 vaddr = (bp->b_un.b_addr - buffers[0]);
b5ad10c3 42 else {
80e7c811 43 io = &mbap->mba_map[128];
b5ad10c3
BJ
44 v = btop(bp->b_un.b_addr);
45 o = (int)bp->b_un.b_addr & PGOFSET;
46 npf = btoc(bp->b_bcount + o);
47 rp = bp->b_flags&B_DIRTY ? &proc[2] : bp->b_proc;
48 vaddr = (128 << 9) | o;
49 if (bp->b_flags & B_UAREA) {
50 for (i = 0; i < UPAGES; i++) {
51 if (rp->p_addr[i].pg_pfnum == 0)
52 panic("mba: zero upage");
53 *(int *)io++ = rp->p_addr[i].pg_pfnum | PG_V;
54 }
55 } else if ((bp->b_flags & B_PHYS) == 0) {
56 v &= 0x1fffff; /* drop to physical addr */
57 while (--npf >= 0)
58 *(int *)io++ = v++ | PG_V;
59 } else {
60 if (bp->b_flags & B_PAGET)
61 pte = &Usrptmap[btokmx((struct pte *)bp->b_un.b_addr)];
62 else
63 pte = vtopte(rp, v);
64 while (--npf >= 0) {
65 if (pte->pg_pfnum == 0)
66 panic("mba, zero entry");
67 *(int *)io++ = pte++->pg_pfnum | PG_V;
68 }
69 }
70 }
71 mbap->mba_sr = -1; /* clear status (error) bits */
72 mbap->mba_bcr = -bp->b_bcount;
73 mbap->mba_var = vaddr;
74 if (bp->b_flags & B_READ)
75 *adcr = MBARCOM | GO;
76 else
77 *adcr = MBAWCOM | GO;
78}
79
80e7c811
BJ
80mbainit(mbanum)
81 int mbanum;
b5ad10c3 82{
80e7c811
BJ
83 register struct pte *io, *b;
84 register int i;
85 register struct mba_info *mi;
86 register struct mba_regs *mbap;
87 unsigned v;
b5ad10c3 88
80e7c811
BJ
89 mi = &mbainfo[mbanum];
90 v = btop((int)mi->mi_phys);
91 b = mi->mi_map;
92 for (i = 0; i < 8192; i += NBPG) {
93 *(int *)b++ = PG_V | PG_KW | v;
94 mtpr(TBIS, ptob(v));
95 v++;
96 }
97 mbap = mi->mi_loc;
98 mbap->mba_cr = MBAINIT;
99 mbap->mba_cr = MBAIE;
100 io = mbap->mba_map;
101 b = &Sysmap[btop(((int)buffers[0])&0x7fffffff)];
102 for (i = NBUF * CLSIZE; i > 0; i--) {
103 *(int *)io++ = PG_V | b->pg_pfnum;
104 b++;
105 }
106 *(int *)io = 0;
107 mbaact |= (1<<mbanum);
b5ad10c3 108}