|
|
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, 1994 NeXT Computer, Inc. ! 27: * ! 28: * Intel386 Family: Access to special processor functions. ! 29: * ! 30: * HISTORY ! 31: * ! 32: * 5 April 1992 ? at NeXT ! 33: * Created. ! 34: */ ! 35: ! 36: #import <architecture/i386/cpu.h> ! 37: ! 38: static inline ! 39: unsigned int ! 40: eflags(void) ! 41: { ! 42: unsigned int value; ! 43: ! 44: asm volatile(" ! 45: pushf ! 46: popl %0" ! 47: : "=r" (value)); ! 48: ! 49: return (value); ! 50: } ! 51: ! 52: static inline ! 53: void ! 54: set_eflags( ! 55: unsigned int value ! 56: ) ! 57: { ! 58: asm volatile(" ! 59: pushl %0; ! 60: popf" ! 61: : ! 62: : "r" (value)); ! 63: } ! 64: ! 65: static inline ! 66: void ! 67: cli(void) ! 68: { ! 69: asm volatile(" ! 70: cli"); ! 71: } ! 72: ! 73: static inline ! 74: void ! 75: sti(void) ! 76: { ! 77: asm volatile(" ! 78: sti"); ! 79: } ! 80: ! 81: static inline ! 82: cr0_t ! 83: cr0(void) ! 84: { ! 85: cr0_t value; ! 86: ! 87: asm volatile(" ! 88: mov %%cr0,%0" ! 89: : "=r" (value)); ! 90: ! 91: return (value); ! 92: } ! 93: ! 94: static inline ! 95: void ! 96: set_cr0( ! 97: cr0_t value ! 98: ) ! 99: { ! 100: asm volatile(" ! 101: mov %0,%%cr0" ! 102: : ! 103: : "r" (value)); ! 104: } ! 105: ! 106: static inline ! 107: void ! 108: clts(void) ! 109: { ! 110: asm volatile(" ! 111: clts"); ! 112: } ! 113: ! 114: static inline ! 115: void ! 116: setts(void) ! 117: { ! 118: cr0_t temp; ! 119: ! 120: temp = cr0(); ! 121: temp.ts = 1; ! 122: ! 123: set_cr0(temp); ! 124: } ! 125: ! 126: static inline ! 127: void ! 128: ltr(void) ! 129: { ! 130: asm volatile("ltr %0" ! 131: : ! 132: : "m" (TSS_SEL)); ! 133: } ! 134: ! 135: static inline ! 136: void ! 137: lldt(void) ! 138: { ! 139: asm volatile("lldt %0" ! 140: : ! 141: : "m" (LDT_SEL)); ! 142: } ! 143: ! 144: static inline ! 145: vm_offset_t ! 146: cr2(void) ! 147: { ! 148: vm_offset_t value; ! 149: ! 150: asm volatile(" ! 151: mov %%cr2,%0" ! 152: : "=r" (value)); ! 153: ! 154: return (value); ! 155: } ! 156: ! 157: static inline ! 158: vm_offset_t ! 159: cr3(void) ! 160: { ! 161: vm_offset_t value; ! 162: ! 163: asm volatile(" ! 164: mov %%cr3,%0" ! 165: : "=r" (value)); ! 166: ! 167: return (value); ! 168: } ! 169: ! 170: static inline ! 171: void ! 172: set_cr3( ! 173: vm_offset_t value ! 174: ) ! 175: { ! 176: asm volatile(" ! 177: mov %0,%%cr3" ! 178: : ! 179: : "r" (value)); ! 180: } ! 181: ! 182: static inline ! 183: void ! 184: flush_tlb(void) ! 185: { ! 186: set_cr3( ! 187: cr3() ! 188: ); ! 189: } ! 190: ! 191: static inline ! 192: void ! 193: invlpg( ! 194: vm_offset_t addr, ! 195: boolean_t kernel ! 196: ) ! 197: { ! 198: if (kernel) ! 199: asm volatile(" ! 200: invlpg %0" ! 201: : ! 202: : "m" (*(unsigned char *)addr)); ! 203: else ! 204: asm volatile(" ! 205: invlpg %%fs:%0" ! 206: : ! 207: : "m" (*(unsigned char *)addr)); ! 208: } ! 209: ! 210: static inline ! 211: void ! 212: flush_cache(void) ! 213: { ! 214: asm volatile("wbinvd"); ! 215: } ! 216: ! 217: static inline ! 218: void ! 219: enable_cache(void) ! 220: { ! 221: cr0_t _cr0 = cr0(); ! 222: ! 223: _cr0.cd = _cr0.nw = 0; ! 224: flush_cache(); set_cr0(_cr0); ! 225: } ! 226: ! 227: static inline ! 228: void ! 229: disable_cache(void) ! 230: { ! 231: cr0_t _cr0 = cr0(); ! 232: ! 233: _cr0.cd = _cr0.nw = 1; ! 234: set_cr0(_cr0); flush_cache(); ! 235: } ! 236: ! 237: static inline ! 238: void ! 239: freeze_cache(void) ! 240: { ! 241: cr0_t _cr0 = cr0(); ! 242: ! 243: _cr0.cd = 1; _cr0.nw = 0; ! 244: set_cr0(_cr0); ! 245: } ! 246: ! 247: static inline ! 248: dr6_t ! 249: dr6( ! 250: void ! 251: ) ! 252: { ! 253: dr6_t value; ! 254: ! 255: asm volatile(" ! 256: mov %%db6,%0" ! 257: : "=r" (value)); ! 258: ! 259: return (value); ! 260: } ! 261: ! 262: static inline ! 263: void ! 264: set_dr6( ! 265: dr6_t value ! 266: ) ! 267: { ! 268: asm volatile(" ! 269: mov %0,%%db6" ! 270: : ! 271: : "r" (value)); ! 272: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.