|
|
1.1 root 1: | @(#)s2map.s 1.1 86/02/03 Copyr 1983 Sun Micro
2: |
3: | Copyright (c) 1984 by Sun Microsystems, Inc.
4: |
5: | /*
6: | * Memory Mapping and Paging on the Sun 2
7: | *
8: | * This is intended to be used for both standalone code (ROM Monitor,
9: | * Diagnostics, boot programs, etc) and for the Unix kernel. IF YOU HAVE
10: | * TO CHANGE IT to fit your application, MOVE THE CHANGE BACK TO THE PUBLIC
11: | * COPY, and make sure the change is upward-compatible. The last thing we
12: | * need is seventeen different copies of this file, like we have with the
13: | * Sun-1 header files.
14: | *
15: | * This file corresponds to version 1.0 of the Sun-2 Design Reference.
16: | * (1 April 83)
17: | */
18: |
19: | /*
20: | * Mapping registers are accessed thru the movs instruction in the Sun-2.
21: | *
22: | * The following subroutines accept any address in the mappable range
23: | * (16 megs). They access the map for the current context register. They
24: | * assume that currently we are running in supervisor state.
25: | */
26: |
27: | struct pgmapent
28: | getpgmap(addr);
29: |
30: | setpgmap(addr, entry);
31:
32: NUMPMEGS = 256
33: LOWMASK = 0xfffff800
34: PMAPOFF = 0x0
35: SMAPOFF = 0x5
36: USERCONTEXTOFF = 0x7
37: SUPCONTEXTOFF = 0x6
38: CONTEXTMASK = 0x7
39: FC_MAP = 0x3
40: PME_INVALID = 0x80000000
41:
42: .text
43:
44: .globl _getpgmap
45: _getpgmap:
46: movl sp@(4),d0 | Get access address
47: andw #LOWMASK,d0 | Mask out low bits
48: movl d0,a0
49: movc sfc,d1 | Save source function code
50: lea FC_MAP,a1 | Get function code in a reg
51: movc a1,sfc | Set source function code
52: movsl a0@,d0 | Read page map entry
53: movc d1,sfc | Restore source function code
54: rts | done
55:
56: .globl _setpgmap
57: _setpgmap:
58: movl sp@(4),d0 | Get access address
59: andw #LOWMASK,d0 | Mask out low bits
60: movl d0,a0
61: lea FC_MAP,a1 | Get function code in a reg
62: | The following code can be used to verify that the only page
63: | table entries written to the Invalid Pmeg are invalid pages, since the
64: | consequences of writing valid entries here are somewhat spectacular.
65: movc sfc,d0 | Save source function code
66: movc a1,sfc | Set source function code, too.
67: movsb a0@(SMAPOFF),d1 | Get segment map entry number
68: movc d0,sfc | Restore source function code
69: | If debug code is removed, next line must remain!
70: movl sp@(8),d0 | Get page map entry to write
71: | More debug code
72: cmpb #NUMPMEGS-1,d1 | Are we writing in the Invalid Pmeg?
73: jne 1$ | Nope, go on.
74: cmpl #PME_INVALID,d0 | Writing the Invalid Page Map Entry?
75: jeq 1$ | Yes, it's ok.
76: bras .-1 | Fault out, this is nasty thing to do.
77: 1$:
78: | End of debugging code.
79: movc dfc,d1 | Save dest function code
80: movc a1,dfc | Set destination function code
81: movsl d0,a0@ | Write page map entry
82: movc d1,dfc | Restore dest function code
83: rts | done
84:
85: .globl _setkcontext
86: _setkcontext:
87: clrl d0 | Get context value to set
88: movc dfc,d1 | Save dest function code
89: lea FC_MAP,a1 | Get function code in a reg
90: movc a1,dfc | Set destination function code
91: movsb d0,USERCONTEXTOFF | Move value into context register
92: movc d1,dfc | Restore dest function code
93: rts
94:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.