|
|
1.1 root 1: /* uba.c 4.5 81/11/12 */
2:
3: #include "../h/param.h"
4: #include "../h/inode.h"
5: #include "../h/cpu.h"
6: #include "../h/pte.h"
7: #include "../h/ubareg.h"
8: #include "../h/vm.h"
9: #include "saio.h"
10: #include "savax.h"
11:
12: /*
13: * Note... this routine does not
14: * really allocate; unless bdp == 2
15: * you always get the same space.
16: * When bdp == 2 you get some other space.
17: */
18: ubasetup(io, bdp)
19: register struct iob *io;
20: int bdp;
21: {
22: int npf;
23: unsigned v;
24: register struct pte *pte;
25: int o, temp, reg;
26: static int lastreg = 128+64;
27:
28: v = btop(io->i_ma);
29: o = (int)io->i_ma & PGOFSET;
30: npf = btoc(io->i_cc + o) +1;
31: if (bdp == 2) {
32: reg = lastreg;
33: lastreg += npf;
34: bdp = 0;
35: } else
36: reg = 0;
37: pte = &ubauba(io->i_unit)->uba_map[reg];
38: temp = (bdp << 21) | UBAMR_MRV;
39: if (bdp && (o & 01))
40: temp |= UBAMR_BO;
41: v &= 0x1fffff; /* drop to physical addr */
42: while (--npf != 0)
43: *(int *)pte++ = v++ | temp;
44: *(int *)pte++ = 0;
45: return ((bdp << 28) | (reg << 9) | o);
46: }
47:
48: ubafree(io, mr)
49: struct iob *io;
50: int mr;
51: {
52: register int bdp;
53:
54: bdp = (mr >> 28) & 0x0f;
55: if (bdp == 0)
56: return;
57: switch (cpu) {
58:
59: case VAX_780:
60: ubauba(io->i_unit)->uba_dpr[bdp] |= UBADPR_BNE;
61: break;
62:
63: case VAX_750:
64: ubauba(io->i_unit)->uba_dpr[bdp] |=
65: UBADPR_PURGE|UBADPR_NXM|UBADPR_UCE;
66: break;
67: case VAX_7ZZ:
68: break;
69: }
70: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.