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