Annotation of XNU/osfmk/i386/proc_reg.h, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
        !             3:  *
        !             4:  * @APPLE_LICENSE_HEADER_START@
        !             5:  * 
        !             6:  * The contents of this file constitute Original Code as defined in and
        !             7:  * are subject to the Apple Public Source License Version 1.1 (the
        !             8:  * "License").  You may not use this file except in compliance with the
        !             9:  * License.  Please obtain a copy of the License at
        !            10:  * http://www.apple.com/publicsource and read it before using this file.
        !            11:  * 
        !            12:  * This Original Code and all software distributed under the License are
        !            13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
        !            14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
        !            15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
        !            16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
        !            17:  * License for the specific language governing rights and limitations
        !            18:  * under the License.
        !            19:  * 
        !            20:  * @APPLE_LICENSE_HEADER_END@
        !            21:  */
        !            22: /*
        !            23:  * @OSF_COPYRIGHT@
        !            24:  */
        !            25: /* CMU_ENDHIST */
        !            26: /* 
        !            27:  * Mach Operating System
        !            28:  * Copyright (c) 1991,1990 Carnegie Mellon University
        !            29:  * All Rights Reserved.
        !            30:  * 
        !            31:  * Permission to use, copy, modify and distribute this software and its
        !            32:  * documentation is hereby granted, provided that both the copyright
        !            33:  * notice and this permission notice appear in all copies of the
        !            34:  * software, derivative works or modified versions, and any portions
        !            35:  * thereof, and that both notices appear in supporting documentation.
        !            36:  * 
        !            37:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
        !            38:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
        !            39:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
        !            40:  * 
        !            41:  * Carnegie Mellon requests users of this software to return to
        !            42:  * 
        !            43:  *  Software Distribution Coordinator  or  [email protected]
        !            44:  *  School of Computer Science
        !            45:  *  Carnegie Mellon University
        !            46:  *  Pittsburgh PA 15213-3890
        !            47:  * 
        !            48:  * any improvements or extensions that they make and grant Carnegie Mellon
        !            49:  * the rights to redistribute these changes.
        !            50:  */
        !            51: 
        !            52: /*
        !            53:  */
        !            54: 
        !            55: /*
        !            56:  * Processor registers for i386 and i486.
        !            57:  */
        !            58: #ifndef        _I386_PROC_REG_H_
        !            59: #define        _I386_PROC_REG_H_
        !            60: 
        !            61: /*
        !            62:  * Model Specific Registers
        !            63:  */
        !            64: #define        MSR_P5_TSC              0x10    /* Time Stamp Register */
        !            65: #define        MSR_P5_CESR             0x11    /* Control and Event Select Register */
        !            66: #define        MSR_P5_CTR0             0x12    /* Counter #0 */
        !            67: #define        MSR_P5_CTR1             0x13    /* Counter #1 */
        !            68: 
        !            69: #define        MSR_P5_CESR_PC          0x0200  /* Pin Control */
        !            70: #define        MSR_P5_CESR_CC          0x01C0  /* Counter Control mask */
        !            71: #define        MSR_P5_CESR_ES          0x003F  /* Event Control mask */
        !            72: 
        !            73: #define        MSR_P5_CESR_SHIFT       16              /* Shift to get Counter 1 */
        !            74: #define        MSR_P5_CESR_MASK        (MSR_P5_CESR_PC|\
        !            75:                                 MSR_P5_CESR_CC|\
        !            76:                                 MSR_P5_CESR_ES) /* Mask Counter */
        !            77: 
        !            78: #define        MSR_P5_CESR_CC_CLOCK    0x0100  /* Clock Counting (otherwise Event) */
        !            79: #define        MSR_P5_CESR_CC_DISABLE  0x0000  /* Disable counter */
        !            80: #define        MSR_P5_CESR_CC_CPL012   0x0040  /* Count if the CPL == 0, 1, 2 */
        !            81: #define        MSR_P5_CESR_CC_CPL3     0x0080  /* Count if the CPL == 3 */
        !            82: #define        MSR_P5_CESR_CC_CPL      0x00C0  /* Count regardless of the CPL */
        !            83: 
        !            84: #define        MSR_P5_CESR_ES_DATA_READ       0x000000 /* Data Read */
        !            85: #define        MSR_P5_CESR_ES_DATA_WRITE      0x000001 /* Data Write */
        !            86: #define        MSR_P5_CESR_ES_DATA_RW         0x101000 /* Data Read or Write */
        !            87: #define        MSR_P5_CESR_ES_DATA_TLB_MISS   0x000010 /* Data TLB Miss */
        !            88: #define        MSR_P5_CESR_ES_DATA_READ_MISS  0x000011 /* Data Read Miss */
        !            89: #define        MSR_P5_CESR_ES_DATA_WRITE_MISS 0x000100 /* Data Write Miss */
        !            90: #define        MSR_P5_CESR_ES_DATA_RW_MISS    0x101001 /* Data Read or Write Miss */
        !            91: #define        MSR_P5_CESR_ES_HIT_EM          0x000101 /* Write (hit) to M|E state */
        !            92: #define        MSR_P5_CESR_ES_DATA_CACHE_WB   0x000110 /* Cache lines written back */
        !            93: #define        MSR_P5_CESR_ES_EXTERNAL_SNOOP  0x000111 /* External Snoop */
        !            94: #define        MSR_P5_CESR_ES_CACHE_SNOOP_HIT 0x001000 /* Data cache snoop hits */
        !            95: #define        MSR_P5_CESR_ES_MEM_ACCESS_PIPE 0x001001 /* Mem. access in both pipes */
        !            96: #define        MSR_P5_CESR_ES_BANK_CONFLICTS  0x001010 /* Bank conflicts */
        !            97: #define        MSR_P5_CESR_ES_MISALIGNED      0x001011 /* Misaligned Memory or I/O */
        !            98: #define        MSR_P5_CESR_ES_CODE_READ       0x001100 /* Code Read */
        !            99: #define        MSR_P5_CESR_ES_CODE_TLB_MISS   0x001101 /* Code TLB miss */
        !           100: #define        MSR_P5_CESR_ES_CODE_CACHE_MISS 0x001110 /* Code Cache miss */
        !           101: #define        MSR_P5_CESR_ES_SEGMENT_LOADED  0x001111 /* Any segment reg. loaded */
        !           102: #define        MSR_P5_CESR_ES_BRANCHE         0x010010 /* Branches */
        !           103: #define        MSR_P5_CESR_ES_BTB_HIT         0x010011 /* BTB Hits */
        !           104: #define        MSR_P5_CESR_ES_BRANCHE_BTB     0x010100 /* Taken branch or BTB Hit */
        !           105: #define        MSR_P5_CESR_ES_PIPELINE_FLUSH  0x010101 /* Pipeline Flushes */
        !           106: #define        MSR_P5_CESR_ES_INSTRUCTION     0x010110 /* Instruction executed */
        !           107: #define        MSR_P5_CESR_ES_INSTRUCTION_V   0x010111 /* Inst. executed (v-pipe) */
        !           108: #define        MSR_P5_CESR_ES_BUS_CYCLE       0x011000 /* Clocks while bus cycle */
        !           109: #define        MSR_P5_CESR_ES_FULL_WRITE_BUF  0x011001 /* Clocks while full wrt buf. */
        !           110: #define        MSR_P5_CESR_ES_DATA_MEM_READ   0x011010 /* Pipeline waiting for read */
        !           111: #define        MSR_P5_CESR_ES_WRITE_EM        0x011011 /* Stall on write E|M state */
        !           112: #define        MSR_P5_CESR_ES_LOCKED_CYCLE    0x011100 /* Locked bus cycles */
        !           113: #define        MSR_P5_CESR_ES_IO_CYCLE        0x011101 /* I/O Read or Write cycles */
        !           114: #define        MSR_P5_CESR_ES_NON_CACHEABLE   0x011110 /* Non-cacheable Mem. read */
        !           115: #define        MSR_P5_CESR_ES_AGI             0x011111 /* Stall because of AGI */
        !           116: #define        MSR_P5_CESR_ES_FLOP            0x100010 /* Floating Point operations */
        !           117: #define        MSR_P5_CESR_ES_BREAK_DR0       0x100011 /* Breakpoint matches on DR0 */
        !           118: #define        MSR_P5_CESR_ES_BREAK_DR1       0x100100 /* Breakpoint matches on DR1 */
        !           119: #define        MSR_P5_CESR_ES_BREAK_DR2       0x100101 /* Breakpoint matches on DR2 */
        !           120: #define        MSR_P5_CESR_ES_BREAK_DR3       0x100110 /* Breakpoint matches on DR3 */
        !           121: #define        MSR_P5_CESR_ES_HARDWARE_IT     0x100111 /* Hardware interrupts */
        !           122: 
        !           123: /*
        !           124:  * CR0
        !           125:  */
        !           126: #define        CR0_PG  0x80000000      /*       Enable paging */
        !           127: #define        CR0_CD  0x40000000      /* i486: Cache disable */
        !           128: #define        CR0_NW  0x20000000      /* i486: No write-through */
        !           129: #define        CR0_AM  0x00040000      /* i486: Alignment check mask */
        !           130: #define        CR0_WP  0x00010000      /* i486: Write-protect kernel access */
        !           131: #define        CR0_NE  0x00000020      /* i486: Handle numeric exceptions */
        !           132: #define        CR0_ET  0x00000010      /*       Extension type is 80387 */
        !           133:                                /*       (not official) */
        !           134: #define        CR0_TS  0x00000008      /*       Task switch */
        !           135: #define        CR0_EM  0x00000004      /*       Emulate coprocessor */
        !           136: #define        CR0_MP  0x00000002      /*       Monitor coprocessor */
        !           137: #define        CR0_PE  0x00000001      /*       Enable protected mode */
        !           138: 
        !           139: /*
        !           140:  * CR4
        !           141:  */
        !           142: #define        CR4_MCE 0x00000040      /* p5:   Machine Check Exceptions */
        !           143: #define        CR4_PSE 0x00000010      /* p5:   Page Size Extensions */
        !           144: #define        CR4_DE  0x00000008      /* p5:   Debugging Extensions */
        !           145: #define        CR4_TSD 0x00000004      /* p5:   Time Stamp Disable */
        !           146: #define        CR4_PVI 0x00000002      /* p5:   Protected-mode Virtual Interrupts */
        !           147: #define        CR4_VME 0x00000001      /* p5:   Virtual-8086 Mode Extensions */
        !           148: 
        !           149: #ifndef        ASSEMBLER
        !           150: extern unsigned int    get_cr0(void);
        !           151: extern void            set_cr0(
        !           152:                                unsigned int            value);
        !           153: extern unsigned int    get_cr2(void);
        !           154: extern unsigned int    get_cr3(void);
        !           155: extern void            set_cr3(
        !           156:                                unsigned int            value);
        !           157: extern unsigned int    get_cr4(void);
        !           158: extern void            set_cr4(
        !           159:                                unsigned int            value);
        !           160: 
        !           161: #define        set_ts() \
        !           162:        set_cr0(get_cr0() | CR0_TS)
        !           163: extern void            clear_ts(void);
        !           164: 
        !           165: extern unsigned short  get_tr(void);
        !           166: extern void            set_tr(
        !           167:                               unsigned int             seg);
        !           168: 
        !           169: extern unsigned short  get_ldt(void);
        !           170: extern void            set_ldt(
        !           171:                                unsigned int            seg);
        !           172: #ifdef __GNUC__
        !           173: extern __inline__ unsigned int get_cr0(void)
        !           174: {
        !           175:        register unsigned int cr0; 
        !           176:        __asm__ volatile("mov %%cr0, %0" : "=r" (cr0));
        !           177:        return(cr0);
        !           178: }
        !           179: 
        !           180: extern __inline__ void set_cr0(unsigned int value)
        !           181: {
        !           182:        __asm__ volatile("mov %0, %%cr0" : : "r" (value));
        !           183: }
        !           184: 
        !           185: extern __inline__ unsigned int get_cr2(void)
        !           186: {
        !           187:        register unsigned int cr2;
        !           188:        __asm__ volatile("mov %%cr2, %0" : "=r" (cr2));
        !           189:        return(cr2);
        !           190: }
        !           191: 
        !           192: #if    NCPUS > 1 && AT386
        !           193: /*
        !           194:  * get_cr3 and set_cr3 are more complicated for the MPs. cr3 is where
        !           195:  * the cpu number gets stored. The MP versions live in locore.s
        !           196:  */
        !           197: #else  /* NCPUS > 1 && AT386 */
        !           198: extern __inline__ unsigned int get_cr3(void)
        !           199: {
        !           200:        register unsigned int cr3;
        !           201:        __asm__ volatile("mov %%cr3, %0" : "=r" (cr3));
        !           202:        return(cr3);
        !           203: }
        !           204: 
        !           205: extern __inline__ void set_cr3(unsigned int value)
        !           206: {
        !           207:        __asm__ volatile("mov %0, %%cr3" : : "r" (value));
        !           208: }
        !           209: #endif /* NCPUS > 1 && AT386 */
        !           210: 
        !           211: extern __inline__ void clear_ts(void)
        !           212: {
        !           213:        __asm__ volatile("clts");
        !           214: }
        !           215: 
        !           216: extern __inline__ unsigned short get_tr(void)
        !           217: {
        !           218:        unsigned short seg; 
        !           219:        __asm__ volatile("str %0" : "=rm" (seg));
        !           220:        return(seg);
        !           221: }
        !           222: 
        !           223: extern __inline__ void set_tr(unsigned int seg)
        !           224: {
        !           225:        __asm__ volatile("ltr %0" : : "rm" ((unsigned short)(seg)));
        !           226: }
        !           227: 
        !           228: extern __inline__ unsigned short get_ldt(void)
        !           229: {
        !           230:        unsigned short seg;
        !           231:        __asm__ volatile("sldt %0" : "=rm" (seg));
        !           232:        return(seg);
        !           233: }
        !           234: 
        !           235: extern __inline__ void set_ldt(unsigned int seg)
        !           236: {
        !           237:        __asm__ volatile("lldt %0" : : "rm" ((unsigned short)(seg)));
        !           238: }
        !           239: 
        !           240: extern __inline__ void flush_tlb(void)
        !           241: {
        !           242:        unsigned long   cr3_temp;
        !           243:        __asm__ volatile("movl %%cr3, %0; movl %0, %%cr3" : "=r" (cr3_temp) :: "memory");
        !           244: }
        !           245: 
        !           246: extern __inline__ void invlpg(unsigned long addr)
        !           247: {
        !           248:        __asm__  volatile("invlpg (%0)" :: "r" (addr) : "memory");
        !           249: }
        !           250: #endif /* __GNUC__ */
        !           251: #endif /* ASSEMBLER */
        !           252: 
        !           253: #endif /* _I386_PROC_REG_H_ */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.