|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights ! 7: * Reserved. This file contains Original Code and/or Modifications of ! 8: * Original Code as defined in and that are subject to the Apple Public ! 9: * Source License Version 1.1 (the "License"). You may not use this file ! 10: * except in compliance with the License. Please obtain a copy of the ! 11: * License at http://www.apple.com/publicsource and read it before using ! 12: * this file. ! 13: * ! 14: * The Original Code and all software distributed under the License are ! 15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 19: * License for the specific language governing rights and limitations ! 20: * under the License. ! 21: * ! 22: * @APPLE_LICENSE_HEADER_END@ ! 23: */ ! 24: ! 25: /* ! 26: * Copyright (c) 1992 NeXT Computer, Inc. ! 27: * ! 28: * Intel386 Family: Inline expansions for pmap. ! 29: * ! 30: * HISTORY ! 31: * ! 32: * 9 April 1992 ? at NeXT ! 33: * Created. ! 34: */ ! 35: ! 36: /* ! 37: * Convert a physical address ! 38: * into an absolute page index. ! 39: */ ! 40: static inline ! 41: unsigned int ! 42: phys_to_pfn( ! 43: unsigned int phys ! 44: ) ! 45: { ! 46: union { ! 47: unsigned int phys; ! 48: struct { ! 49: unsigned int :12, ! 50: pfn :20; ! 51: } fields; ! 52: } conv; ! 53: ! 54: conv.phys = phys; ! 55: ! 56: return (conv.fields.pfn); ! 57: } ! 58: ! 59: /* ! 60: * Return the address corresponding ! 61: * the an absolute physical page ! 62: * index. ! 63: */ ! 64: static inline ! 65: unsigned int ! 66: pfn_to_phys( ! 67: unsigned int pfn ! 68: ) ! 69: { ! 70: union { ! 71: unsigned int phys; ! 72: struct { ! 73: unsigned int :12, ! 74: pfn :20; ! 75: } fields; ! 76: } conv; ! 77: ! 78: conv.phys = 0; ! 79: conv.fields.pfn = pfn; ! 80: ! 81: return (conv.phys); ! 82: } ! 83: ! 84: /* ! 85: * Return the page offset part ! 86: * of an address, virtual or ! 87: * physical. ! 88: */ ! 89: static inline ! 90: unsigned int ! 91: page_offset( ! 92: unsigned int addr /* XXX vm or phys */ ! 93: ) ! 94: { ! 95: union { ! 96: unsigned int addr; ! 97: struct { ! 98: unsigned int offset :12, ! 99: :20; ! 100: } fields; ! 101: } conv; ! 102: ! 103: conv.addr = addr; ! 104: ! 105: return (conv.fields.offset); ! 106: } ! 107: ! 108: /* ! 109: * Given a ptr to a page ! 110: * directory and a virtual ! 111: * address, return a ptr to ! 112: * the corresponding ! 113: * page directory entry. ! 114: */ ! 115: static inline ! 116: pd_entry_t * ! 117: pd_to_pd_entry( ! 118: pd_entry_t p[], ! 119: vm_offset_t v ! 120: ) ! 121: { ! 122: union { ! 123: vm_offset_t virt; ! 124: struct { ! 125: unsigned int :12, ! 126: :10, ! 127: index :10; ! 128: } fields; ! 129: } conv; ! 130: ! 131: conv.virt = v; ! 132: ! 133: return (&p[conv.fields.index]); ! 134: } ! 135: ! 136: /* ! 137: * Given a ptr to a page ! 138: * table and a virtual ! 139: * address, return a ptr to ! 140: * the corresponding ! 141: * page table entry. ! 142: */ ! 143: static inline ! 144: pt_entry_t * ! 145: pt_to_pt_entry( ! 146: pt_entry_t p[], ! 147: vm_offset_t v ! 148: ) ! 149: { ! 150: union { ! 151: vm_offset_t virt; ! 152: struct { ! 153: unsigned int :12, ! 154: index :10, ! 155: :10; ! 156: } fields; ! 157: } conv; ! 158: ! 159: conv.virt = v; ! 160: ! 161: return (&p[conv.fields.index]); ! 162: } ! 163: ! 164: /* ! 165: * Return the virtual address ! 166: * of the page table referenced ! 167: * by a page directory entry. ! 168: */ ! 169: static inline ! 170: pt_entry_t * ! 171: pd_entry_to_pt( ! 172: pd_entry_t *p ! 173: ) ! 174: { ! 175: return ((pt_entry_t *)(pfn_to_phys(p->pfn) + ! 176: VM_MIN_KERNEL_ADDRESS)); ! 177: } ! 178: ! 179: /* ! 180: * Given a ptr to a valid page ! 181: * directory entry and a virtual ! 182: * address, walk to the corresponding ! 183: * page table entry, and return a ptr ! 184: * to it. ! 185: */ ! 186: static inline ! 187: pt_entry_t * ! 188: pd_entry_to_pt_entry( ! 189: pd_entry_t *p, ! 190: vm_offset_t v ! 191: ) ! 192: { ! 193: return (pt_to_pt_entry(pd_entry_to_pt(p), v)); ! 194: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.