| 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 | } |