|
|
1.1 root 1: /*
2: * Copyright (c) 1982, 1986, 1988 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: *
6: * @(#)uba.c 7.5 (Berkeley) 4/4/90
7: */
8:
9: #include "param.h"
10: #include "vm.h"
11:
12: #include "../vax/pte.h"
13: #include "../vax/cpu.h"
14: #include "../vaxuba/ubareg.h"
15:
16: #include "saio.h"
17: #include "savax.h"
18:
19: /*
20: * Note... this routine does not
21: * really allocate; unless bdp == 2
22: * you always get the same space.
23: * When bdp == 2 you get some other space.
24: */
25: ubasetup(io, bdp)
26: register struct iob *io;
27: int bdp;
28: {
29: int npf;
30: unsigned int v;
31: register struct pte *pte;
32: int o, temp, reg;
33: static int lastreg = 128+64;
34:
35: v = btop(io->i_ma);
36: o = (int)io->i_ma & PGOFSET;
37: npf = btoc(io->i_cc + o) +1;
38: if (bdp == 2) {
39: reg = lastreg;
40: lastreg += npf;
41: bdp = 0;
42: } else
43: reg = 0;
44: pte = &ubauba(io->i_adapt)->uba_map[reg];
45: temp = (bdp << 21) | UBAMR_MRV;
46: if (bdp && (o & 01))
47: temp |= UBAMR_BO;
48: v &= 0x1fffff; /* drop to physical addr */
49: while (--npf != 0)
50: *(int *)pte++ = v++ | temp;
51: *(int *)pte++ = 0;
52: return ((bdp << 28) | (reg << 9) | o);
53: }
54:
55: ubafree(io, mr)
56: struct iob *io;
57: int mr;
58: {
59: register int bdp;
60:
61: bdp = (mr >> 28) & 0x0f;
62: if (bdp == 0)
63: return;
64: switch (cpu) {
65:
66: #if VAX8200
67: case VAX_8200:
68: UBA_PURGEBUA(ubauba(io->i_adapt), bdp);
69: break;
70: #endif
71:
72: #if VAX780 || VAX8600
73: case VAX_8600:
74: case VAX_780:
75: ubauba(io->i_adapt)->uba_dpr[bdp] |= UBADPR_BNE;
76: break;
77: #endif
78:
79: #if VAX750
80: case VAX_750:
81: ubauba(io->i_adapt)->uba_dpr[bdp] |=
82: UBADPR_PURGE|UBADPR_NXM|UBADPR_UCE;
83: break;
84: #endif
85:
86: default:
87: break;
88: }
89: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.