|
|
1.1 ! root 1: Overview: ! 2: -------- ! 3: ! 4: (Some of this is gleaned from an article in the September 1986 ! 5: Hewlett-Packard Journal and info in the July 1987 HP Communicator) ! 6: ! 7: Page and segment table entries mimic the Motorola 68851 PMMU, ! 8: in an effort at upward compatibility. The HP MMU uses a two ! 9: level translation scheme. There are seperate (but equal!) ! 10: translation tables for both supervisor and user modes. At the ! 11: lowest level are page tables. Each page table consists of one ! 12: or more 4k pages of 1024x4 byte page table entries. Each PTE ! 13: maps one 4k page of VA space. At the highest level is the ! 14: segment table. The segment table is a single 4K page of 1024x4 ! 15: byte entries. Each entry points to a 4k page of PTEs. Hence ! 16: one STE maps 4Mb of VA space and one page of STEs is sufficient ! 17: to map the entire 4Gb address space (what a coincidence!). The ! 18: unused valid bit in page and segment table entries must be ! 19: zero. ! 20: ! 21: There are seperate translation lookaside buffers for the user ! 22: and supervisor modes, each containing 1024 entries. ! 23: ! 24: To augment the 68020's instruction cache, the HP CPU has an ! 25: external cache. A logical cache implementation is used with 16 ! 26: Kbytes of cache on 320 systems and 32 Kbytes on 350 systems. ! 27: Each cache entry can contain instructions or data, from either ! 28: user or supervisor space. Seperate valid bits are kept for ! 29: user and supervisor entries, allowing for descriminatory ! 30: flushing of the cache. ! 31: ! 32: MMU translation and cache-miss detection are done in parallel. ! 33: ! 34: ! 35: Segment table entries: ! 36: ------- ----- ------- ! 37: ! 38: bits 31-12: Physical page frame number of PT page ! 39: bits 11-4: Reserved at zero ! 40: (can software use them?) ! 41: bit 3: Reserved at one ! 42: bit 2: Set to 1 if segment is read-only, ow read-write ! 43: bits 1-0: Valid bits ! 44: (hardware uses bit 1) ! 45: ! 46: ! 47: Page table entries: ! 48: ---- ----- ------- ! 49: ! 50: bits 31-12: Physical page frame number of page ! 51: bits 11-7: Available for software use ! 52: bit 6: If 1, inhibits caching of data in this page. ! 53: (both instruction and external cache) ! 54: bit 5: Reserved at zero ! 55: bit 4: Hardware modify bit ! 56: bit 3: Hardware reference bit ! 57: bit 2: Set to 1 if page is read-only, ow read-write ! 58: bits 1-0: Valid bits ! 59: (hardware uses bit 0) ! 60: ! 61: ! 62: Hardware registers: ! 63: -------- --------- ! 64: ! 65: The hardware has four longword registers controlling the MMU. ! 66: The registers can be accessed as shortwords also (remember to ! 67: add 2 to addresses given below). ! 68: ! 69: 5F4000: Supervisor mode segment table pointer. Loaded (as longword) ! 70: with page frame number (i.e. Physaddr >> 12) of the segment ! 71: table mapping supervisor space. ! 72: 5F4004: User mode segment table pointer. Loaded (as longword) with ! 73: page frame number of the segment table mapping user space. ! 74: 5F4008: TLB control register. Used to invalid large sections of the ! 75: TLB. More info below. ! 76: 5F400C: MMU command/status register. Defined as follows: ! 77: ! 78: bit 15: If 1, indicates a page table fault occured ! 79: bit 14: If 1, indicates a page fault occured ! 80: bit 13: If 1, indicates a protection fault (write to RO page) ! 81: bit 6: MC68881 enable. Tied to chip enable line. ! 82: (set this bit to enable) ! 83: bit 5: MC68020 instruction cache enable. Tied to Insruction ! 84: cache disable line. (set this bit to enable) ! 85: bit 3: If 1, indicates an MMU related bus error occured. ! 86: Bits 13-15 are now valid. ! 87: bit 2: External cache enable. (set this bit to enable) ! 88: bit 1: Supervisor mapping enable. Enables translation of ! 89: supervisor space VAs. ! 90: bit 0: User mapping enable. Enables translation of user ! 91: space VAs. ! 92: ! 93: ! 94: Any bits set by the hardware are cleared only by software. ! 95: (i.e. bits 3,13,14,15) ! 96: ! 97: Invalidating TLB: ! 98: ------------ --- ! 99: ! 100: All translations: ! 101: Read the TLB control register (5F4008) as a longword. ! 102: ! 103: User translations only: ! 104: Write a longword 0 to TLB register or set the user ! 105: segment table pointer. ! 106: ! 107: Supervisor translations only: ! 108: Write a longword 0x8000 to TLB register or set the ! 109: supervisor segment table pointer. ! 110: ! 111: A particular VA translation: ! 112: Set destination function code to 3 ("purge" space), ! 113: write a longword 0 to the VA whose translation we are to ! 114: invalidate, and restore function code. This apparently ! 115: invalidates any translation for that VA in both the user ! 116: and supervisor LB. Here is what I did: ! 117: ! 118: #define FC_PURGE 3 ! 119: #define FC_USERD 1 ! 120: _TBIS: ! 121: movl sp@(4),a0 | VA to invalidate ! 122: moveq #FC_PURGE,d0 | change address space ! 123: movc d0,dfc | for destination ! 124: moveq #0,d0 | zero to invalidate? ! 125: movsl d0,a0@ | hit it ! 126: moveq #FC_USERD,d0 | back to old ! 127: movc d0,dfc | address space ! 128: rts | done ! 129: ! 130: ! 131: Invalidating the external cache: ! 132: ------------ --- -------- ----- ! 133: ! 134: Everything: ! 135: Toggle the cache enable bit (bit 2) in the MMU control ! 136: register (5F400C). Can be done by ANDing and ORing the ! 137: register location. ! 138: ! 139: User: ! 140: Change the user segment table pointer register (5F4004), ! 141: i.e. read the current value and write it back. ! 142: ! 143: Supervisor: ! 144: Change the supervisor segment table pointer register ! 145: (5F4000), i.e. read the current value and write it back.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.