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