|
|
1.1 root 1: /* @(#)map.s 1.1 86/02/03 SMI */
2:
3: /*
4: * Copyright (c) 1985 by Sun Microsystems, Inc.
5: */
6:
7: /*
8: * Memory Mapping and Paging on the Sun-3.
9: * NOTE: All of these routines assume that the
10: * default sfc and dfc have been preset to FC_MAP.
11: */
12:
13: #include "../h/param.h"
14: #include "../machine/asm_linkage.h"
15: #include "../machine/mmu.h"
16: #include "../machine/pte.h"
17:
18: .text
19: |
20: | Sets the pte Referenced and Modified bits based on the
21: | pme for page pageno and then clears the these bits in the pme.
22: |
23: | unloadpgmap(pageno, pte)
24: | u_int pageno;
25: | struct pte* pte;
26: ENTRY(unloadpgmap)
27: movl sp@(8),a1
28: movl a1@,d0 | valid?
29: bge 0f | no, just return
30: movl sp@(4),d0 | get first parameter
31: moveq #PGSHIFT,d1 | set of count for shift
32: lsll d1,d0 | convert to address
33: orl #PAGEBASE,d0 | set to page map base offset
34: movl d0,a0 | move into a0
35: movsl a0@,d0 | read page map entry
36: movl d0,d1
37: bge 0f | skip if invalid
38: andl #(PG_R+PG_M),d0 | save Reference and Modified bits
39: orl d0,a1@ | add these bits into software pte
40: andl #~(PG_R+PG_M),d1 | turn off Reference and Modified bits
41: movsl d1,a0@ | put new page map entry back
42: 0:
43: rts | done
44:
45: |
46: | Read the page map entry for the given address v
47: | and return it in a form suitable for software use.
48: |
49: | long
50: | getpgmap(v)
51: | caddr_t v;
52: ENTRY(getpgmap)
53: movl sp@(4),d0 | get access address
54: andl #PAGEADDRBITS,d0 | clear extraneous bits
55: orl #PAGEBASE,d0 | set to page map base offset
56: movl d0,a0
57: movsl a0@,d0 | read page map entry
58: | no mods needed to make pte from pme
59: rts | done
60:
61: |
62: | Set the pme for address v using the software pte given.
63: |
64: | setpgmap(v, pte)
65: | caddr_t v;
66: | long pte;
67: ENTRY(setpgmap)
68: movl sp@(4),d0 | get access address
69: andl #PAGEADDRBITS,d0 | clear extraneous bits
70: orl #PAGEBASE,d0 | set to page map base offset
71: movl d0,a0
72: movl sp@(8),d0 | get page map entry to write
73: | no mods need to make pme from pte
74: movsl d0,a0@ | write page map entry
75: rts | done
76:
77: |
78: | Load the pme for page pageno using the pte given.
79: | If the original pme is valid and we are not on
80: | a new pmeg, then the R and M bits are preserved
81: | from the original pme.
82: |
83: | loadpgmap(pageno, pte, new)
84: | u_int pageno; /* virtual page to set up */
85: | struct pte *pte; /* pointer to pte to use */
86: | int new; /* new pmeg flag */
87: ENTRY(loadpgmap)
88: movl sp@(4),d0 | get first parameter
89: moveq #PGSHIFT,d1 | set of count for shift
90: lsll d1,d0 | convert to address
91: andl #PAGEADDRBITS,d0 | clear extraneous bits
92: orl #PAGEBASE,d0 | set to page map base offset
93: movl d0,a1
94: movl sp@(8),a0 | get address of page map entry to write
95: movl a0@,d0 | read old page map entry
96: bge 0f | skip if not valid
97: tstl sp@(12) | new pmeg?
98: bne 0f | yes, don't save bits
99: movsl a1@,d1 | get old pme
100: andl #(PG_R+PG_M),d1 | mask off ref and mod bits
101: orl d1,d0 | or them into new pme
102: 0:
103: movsl d0,a1@ | write page map entry
104: rts | done
105:
106: |
107: | Return the 8 bit segment map entry for the given segment number.
108: |
109: | u_char
110: | getsegmap(segno)
111: | u_int segno;
112: ENTRY(getsegmap)
113: movl sp@(4),d0 | get segment number
114: moveq #SGSHIFT,d1 | get count for shift
115: lsll d1,d0 | convert to address
116: andl #SEGMENTADDRBITS,d0 | clear extraneous bits
117: orl #SEGMENTBASE,d0 | set to segment map offset
118: movl d0,a0
119: moveq #0,d0 | clear (upper part of) register
120: movsb a0@,d0 | read segment map entry
121: rts | done
122:
123: |
124: | Set the segment map entry for segno to pm.
125: |
126: | setsegmap(segno, pm)
127: | u_int segno;
128: | u_char pm;
129: ENTRY(setsegmap)
130: movl sp@(4),d0 | get segment number
131: moveq #SGSHIFT,d1 | get count for shift
132: lsll d1,d0 | convert to address
133: andl #SEGMENTADDRBITS,d0 | clear extraneous bits
134: orl #SEGMENTBASE,d0 | set to segment map offset
135: movl d0,a0
136: movl sp@(8),d0 | get seg map entry to write
137: movsb d0,a0@ | write segment map entry
138: rts | done
139:
140: |
141: | Return the current [user] context number.
142: |
143: | int
144: | getcontext()
145: ENTRY2(getcontext,getusercontext)
146: movsb CONTEXTBASE,d0 | move context reg into result
147: andl #CONTEXTMASK,d0 | clear high-order bits
148: rts | done
149:
150: |
151: | Set the current [user] context number to uc.
152: |
153: | setcontext(uc)
154: | int uc;
155: ENTRY2(setcontext,setusercontext)
156: movb sp@(7),d0 | get context value to set
157: movsb d0,CONTEXTBASE | move value into context register
158: rts | done
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.