|
|
1.1 root 1: /*
2: * system-mode mapping
3: * 32032/sequent version
4: */
5:
6: #include "defs.h"
7: #include "machine.h"
8: #include "space.h"
9: #include <machine/pte.h>
10: #include <machine/param.h>
11:
12: static long sysptb, usrptb;
13: static int kmode;
14:
15: #define KOFF 0
16: #define KSYS 1
17: #define KUSR 2
18:
19: printkm()
20: {
21:
22: printf("%R$k\n%R$u\n", sysptb, usrptb);
23: if (kmode == KSYS)
24: printf("sys\n");
25: else if (kmode == KUSR)
26: printf("user\n");
27: else
28: printf("off\n");
29: }
30:
31: kmsys()
32: {
33:
34: if (adrflg) {
35: sysptb = dot;
36: kmode = KSYS;
37: return;
38: }
39: if (expr(0)) {
40: if (expv)
41: kmode = KSYS;
42: else
43: kmode = KUSR;
44: return;
45: }
46: printkm();
47: }
48:
49: kmproc()
50: {
51:
52: if (adrflg) {
53: sysptb = dot;
54: kmode = KUSR;
55: return;
56: }
57: if (expr(0)) {
58: if (expv)
59: kmode = KUSR;
60: else
61: kmode = KSYS;
62: return;
63: }
64: printkm();
65: }
66:
67: /*
68: * map a kernel address to a physical address
69: * arg is a pointer to be filled in
70: * returns nonzero if address is valid
71: */
72:
73: int
74: kmap(paddr, sp)
75: ADDR *paddr;
76: {
77: switch (kmode) {
78: case KUSR:
79: return (transl(paddr, sp, usrptb));
80:
81: case KSYS:
82: return (transl(paddr, sp, sysptb));
83:
84: default:
85: return (1);
86: }
87: }
88:
89: /*
90: * virtual -> physical addr, given the right pt base
91: */
92: static long
93: transl(ap, sp, ptb)
94: register long *ap;
95: int sp;
96: long ptb;
97: {
98: long pt;
99:
100: pt = ltow(lget((ADDR)(ptb + L1IDX(*ap) * sizeof(struct pte)), sp|RAWADDR));
101: if (errflg)
102: return (0);
103: if ((pt & PG_V) == 0)
104: return (0);
105: pt = PTETOPHYS(pt) + L2IDX(*ap) * sizeof(struct pte);
106: pt = ltow(lget((ADDR)pt, sp|RAWADDR));
107: if (errflg)
108: return (0);
109: *ap = (*ap & PGOFSET) + PTETOPHYS(pt);
110: return (1);
111: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.