|
|
1.1 root 1: | s3map.s 1.1 86/02/03 Copyright (c) 1985 by Sun Microsystems, Inc.
2: |
3: | /*
4: | * Memory Mapping and Paging on the Sun 3
5: | */
6: |
7: | /*
8: | * Mapping registers are accessed thru the movs instruction in the Sun-3.
9: | *
10: | * The following subroutines accept any address in the mappable range
11: | * (256 megs). They access the map for the current context register. They
12: | * assume that currently we are running in supervisor state.
13: | */
14: |
15: /*
16: * These constants are fixed by the hardware,
17: * so don't feel too bad that I redefined them here
18: */
19: #define FC_MAP 3 /* space for MMU ops */
20: #define NUMPMEGS 256 /* number of Pmegs */
21: #define PMAPOFF 0x10000000 /* offset for page map */
22: #define SMAPOFF 0x20000000 /* offset for segment map */
23: #define MAPADDRMASK 0x0FFFE000 /* translatable bits */
24: #define PME_INVALID 0 /* invalid page */
25:
26: .text
27:
28: .globl _setpgmap
29: _setpgmap:
30: movl sp@(4),d0 | Get access address
31: andl #MAPADDRMASK,d0 | Mask out irrelevant bits
32: addl #PMAPOFF,d0 | Offset to page maps
33: movl d0,a0
34: lea FC_MAP,a1 | Get function code in a reg
35: | The following code can be used to verify that the only page
36: | table entries written to the Invalid Pmeg are invalid pages, since the
37: | consequences of writing valid entries here are somewhat spectacular.
38: movc sfc,d0 | Save source function code
39: movc a1,sfc | Set source function code, too.
40: addl #SMAPOFF-PMAPOFF,a0 | Offset to segment map
41: movsb a0@,d1 | Get segment map entry number
42: subl #SMAPOFF-PMAPOFF,a0 | Offset back to page map
43: movc d0,sfc | Restore source function code
44: | If debug code is removed, next line must remain!
45: movl sp@(8),d0 | Get page map entry to write
46: | More debug code
47: #if NUMPMEGS != 256
48: andb #NUMPMEGS-1,d1 | Top bit ignored in 128-pmeg version
49: #endif
50: cmpb #NUMPMEGS-1,d1 | Are we writing in the Invalid Pmeg?
51: jne 1$ | Nope, go on.
52: cmpl #PME_INVALID,d0 | Writing the Invalid Page Map Entry?
53: jeq 1$ | Yes, it's ok.
54: bras .-1 | Fault out, this is nasty thing to do.
55: 1$:
56: | End of debugging code.
57: movc dfc,d1 | Save dest function code
58: movc a1,dfc | Set destination function code
59: movsl d0,a0@ | Write page map entry
60: movc d1,dfc | Restore dest function code
61: rts | done
62:
63: |
64: | Read the page map entry for the given address v
65: | and return it in a form suitable for software use.
66: |
67: | long
68: | getpgmap(v)
69: | caddr_t v;
70: .globl _getpgmap
71: _getpgmap:
72: movl sp@(4),d0 | get access address
73: andl #MAPADDRMASK,d0 | clear extraneous bits
74: orl #PMAPOFF,d0 | set to page map base offset
75: lea FC_MAP,a1 | Get function code in a reg
76: movc sfc,d1 | Save source function code
77: movc a1,sfc | Set source function code, too.
78: movl d0,a0
79: movsl a0@,d0 | read page map entry
80: | no mods needed to make pte from pme
81: movc d1,sfc | restore function code
82: rts | done
83:
84: .globl _setsegmap
85: _setsegmap:
86: movl sp@(4),d0 | Get access address
87: andl #MAPADDRMASK,d0 | Mask out irrelevant bits
88: addl #SMAPOFF,d0 | Bump to segment map offset
89: movl d0,a0
90: movl sp@(8),d0 | Get seg map entry to write
91: movc dfc,d1 | Save dest function code
92: lea FC_MAP,a1 | Get function code in a reg
93: movc a1,dfc | Set destination function code
94: movsb d0,a0@ | Write segment map entry
95: movc d1,dfc | Restore dest function code
96: rts | done
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.