| /* |
| * Copyright (c) 2007 The Hewlett-Packard Development Company |
| * All rights reserved. |
| * |
| * Redistribution and use of this software in source and binary forms, |
| * with or without modification, are permitted provided that the |
| * following conditions are met: |
| * |
| * The software must be used only for Non-Commercial Use which means any |
| * use which is NOT directed to receiving any direct monetary |
| * compensation for, or commercial advantage from such use. Illustrative |
| * examples of non-commercial use are academic research, personal study, |
| * teaching, education and corporate research & development. |
| * Illustrative examples of commercial use are distributing products for |
| * commercial advantage and providing services using the software for |
| * commercial advantage. |
| * |
| * If you wish to use this software or functionality therein that may be |
| * covered by patents for commercial use, please contact: |
| * Director of Intellectual Property Licensing |
| * Office of Strategy and Technology |
| * Hewlett-Packard Company |
| * 1501 Page Mill Road |
| * Palo Alto, California 94304 |
| * |
| * Redistributions of source code must retain the above copyright notice, |
| * this list of conditions and the following disclaimer. Redistributions |
| * in binary form must reproduce the above copyright notice, this list of |
| * conditions and the following disclaimer in the documentation and/or |
| * other materials provided with the distribution. Neither the name of |
| * the COPYRIGHT HOLDER(s), HEWLETT-PACKARD COMPANY, nor the names of its |
| * contributors may be used to endorse or promote products derived from |
| * this software without specific prior written permission. No right of |
| * sublicense is granted herewith. Derivatives of the software and |
| * output created using the software may be prepared, but only for |
| * Non-Commercial Uses. Derivatives of the software may be shared with |
| * others provided: (i) the others agree to abide by the list of |
| * conditions herein which includes the Non-Commercial Use restrictions; |
| * and (ii) such Derivatives of the software include the above copyright |
| * notice to acknowledge the contribution from this software where |
| * applicable, this list of conditions and the disclaimer below. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| * |
| * Authors: Gabe Black |
| */ |
| |
| #ifndef __ARCH_X86_MISCREGS_HH__ |
| #define __ARCH_X86_MISCREGS_HH__ |
| |
| #include "arch/x86/x86_traits.hh" |
| #include "base/bitunion.hh" |
| |
| //These get defined in some system headers (at least termbits.h). That confuses |
| //things here significantly. |
| #undef CR0 |
| #undef CR2 |
| #undef CR3 |
| |
| namespace X86ISA |
| { |
| enum CondFlagBit { |
| CFBit = 1 << 0, |
| PFBit = 1 << 2, |
| ECFBit = 1 << 3, |
| AFBit = 1 << 4, |
| EZFBit = 1 << 5, |
| ZFBit = 1 << 6, |
| SFBit = 1 << 7, |
| DFBit = 1 << 10, |
| OFBit = 1 << 11 |
| }; |
| |
| enum MiscRegIndex |
| { |
| // Control registers |
| // Most of these are invalid. |
| MISCREG_CR_BASE, |
| MISCREG_CR0 = MISCREG_CR_BASE, |
| MISCREG_CR1, |
| MISCREG_CR2, |
| MISCREG_CR3, |
| MISCREG_CR4, |
| MISCREG_CR5, |
| MISCREG_CR6, |
| MISCREG_CR7, |
| MISCREG_CR8, |
| MISCREG_CR9, |
| MISCREG_CR10, |
| MISCREG_CR11, |
| MISCREG_CR12, |
| MISCREG_CR13, |
| MISCREG_CR14, |
| MISCREG_CR15, |
| |
| // Debug registers |
| MISCREG_DR_BASE = MISCREG_CR_BASE + NumCRegs, |
| MISCREG_DR0 = MISCREG_DR_BASE, |
| MISCREG_DR1, |
| MISCREG_DR2, |
| MISCREG_DR3, |
| MISCREG_DR4, |
| MISCREG_DR5, |
| MISCREG_DR6, |
| MISCREG_DR7, |
| |
| // Flags register |
| MISCREG_RFLAGS = MISCREG_DR_BASE + NumDRegs, |
| |
| // Segment selectors |
| MISCREG_SEG_SEL_BASE, |
| MISCREG_ES = MISCREG_SEG_SEL_BASE, |
| MISCREG_CS, |
| MISCREG_SS, |
| MISCREG_DS, |
| MISCREG_FS, |
| MISCREG_GS, |
| |
| // Hidden segment base field |
| MISCREG_SEG_BASE_BASE = MISCREG_SEG_SEL_BASE + NumSegments, |
| MISCREG_ES_BASE = MISCREG_SEG_BASE_BASE, |
| MISCREG_CS_BASE, |
| MISCREG_SS_BASE, |
| MISCREG_DS_BASE, |
| MISCREG_FS_BASE, |
| MISCREG_GS_BASE, |
| |
| // Hidden segment limit field |
| MISCREG_SEG_LIMIT_BASE = MISCREG_SEG_BASE_BASE + NumSegments, |
| MISCREG_ES_LIMIT = MISCREG_SEG_LIMIT_BASE, |
| MISCREG_CS_LIMIT, |
| MISCREG_SS_LIMIT, |
| MISCREG_DS_LIMIT, |
| MISCREG_FS_LIMIT, |
| MISCREG_GS_LIMIT, |
| |
| // Hidden segment limit attributes |
| MISCREG_SEG_ATTR_BASE = MISCREG_SEG_LIMIT_BASE + NumSegments, |
| MISCREG_ES_ATTR = MISCREG_SEG_ATTR_BASE, |
| MISCREG_CS_ATTR, |
| MISCREG_SS_ATTR, |
| MISCREG_DS_ATTR, |
| MISCREG_FS_ATTR, |
| MISCREG_GS_ATTR, |
| |
| // System segment selectors |
| MISCREG_SYSSEG_SEL_BASE = MISCREG_SEG_ATTR_BASE + NumSegments, |
| MISCREG_LDTR = MISCREG_SYSSEG_SEL_BASE, |
| MISCREG_TR, |
| |
| // Hidden system segment base field |
| MISCREG_SYSSEG_BASE_BASE = MISCREG_SYSSEG_SEL_BASE + NumSysSegments, |
| MISCREG_LDTR_BASE = MISCREG_SYSSEG_BASE_BASE, |
| MISCREG_TR_BASE, |
| MISCREG_GDTR_BASE, |
| MISCREG_IDTR_BASE, |
| |
| // Hidden system segment limit field |
| MISCREG_SYSSEG_LIMIT_BASE = MISCREG_SYSSEG_BASE_BASE + NumSysSegments, |
| MISCREG_LDTR_LIMIT = MISCREG_SYSSEG_LIMIT_BASE, |
| MISCREG_TR_LIMIT, |
| MISCREG_GDTR_LIMIT, |
| MISCREG_IDTR_LIMIT, |
| |
| // Hidden system segment attribute field |
| MISCREG_SYSSEG_ATTR_BASE = MISCREG_SYSSEG_LIMIT_BASE + NumSysSegments, |
| MISCREG_LDTR_ATTR = MISCREG_SYSSEG_ATTR_BASE, |
| MISCREG_TR_ATTR, |
| |
| // Floating point control registers |
| MISCREG_X87_TOP = MISCREG_SYSSEG_ATTR_BASE + NumSysSegments, |
| |
| //XXX Add "Model-Specific Registers" |
| |
| NUM_MISCREGS |
| }; |
| |
| static inline MiscRegIndex |
| MISCREG_CR(int index) |
| { |
| return (MiscRegIndex)(MISCREG_CR_BASE + index); |
| } |
| |
| static inline MiscRegIndex |
| MISCREG_DR(int index) |
| { |
| return (MiscRegIndex)(MISCREG_DR_BASE + index); |
| } |
| |
| static inline MiscRegIndex |
| MISCREG_SEG_SEL(int index) |
| { |
| return (MiscRegIndex)(MISCREG_SEG_SEL_BASE + index); |
| } |
| |
| static inline MiscRegIndex |
| MISCREG_SEG_BASE(int index) |
| { |
| return (MiscRegIndex)(MISCREG_SEG_BASE_BASE + index); |
| } |
| |
| static inline MiscRegIndex |
| MISCREG_SEG_LIMIT(int index) |
| { |
| return (MiscRegIndex)(MISCREG_SEG_LIMIT_BASE + index); |
| } |
| |
| static inline MiscRegIndex |
| MISCREG_SEG_ATTR(int index) |
| { |
| return (MiscRegIndex)(MISCREG_SEG_ATTR_BASE + index); |
| } |
| |
| static inline MiscRegIndex |
| MISCREG_SYSSEG_SEL(int index) |
| { |
| return (MiscRegIndex)(MISCREG_SYSSEG_SEL_BASE + index); |
| } |
| |
| static inline MiscRegIndex |
| MISCREG_SYSSEG_BASE(int index) |
| { |
| return (MiscRegIndex)(MISCREG_SYSSEG_BASE_BASE + index); |
| } |
| |
| static inline MiscRegIndex |
| MISCREG_SYSSEG_LIMIT(int index) |
| { |
| return (MiscRegIndex)(MISCREG_SYSSEG_LIMIT_BASE + index); |
| } |
| |
| static inline MiscRegIndex |
| MISCREG_SYSSEG_ATTR(int index) |
| { |
| return (MiscRegIndex)(MISCREG_SYSSEG_ATTR_BASE + index); |
| } |
| |
| /** |
| * A type to describe the condition code bits of the RFLAGS register, |
| * plus two flags, EZF and ECF, which are only visible to microcode. |
| */ |
| BitUnion64(CCFlagBits) |
| Bitfield<11> OF; |
| Bitfield<7> SF; |
| Bitfield<6> ZF; |
| Bitfield<5> EZF; |
| Bitfield<4> AF; |
| Bitfield<3> ECF; |
| Bitfield<2> PF; |
| Bitfield<0> CF; |
| EndBitUnion(CCFlagBits) |
| |
| /** |
| * RFLAGS |
| */ |
| BitUnion64(RFLAGS) |
| Bitfield<21> ID; // ID Flag |
| Bitfield<20> VIP; // Virtual Interrupt Pending |
| Bitfield<19> VIF; // Virtual Interrupt Flag |
| Bitfield<18> AC; // Alignment Check |
| Bitfield<17> VM; // Virtual-8086 Mode |
| Bitfield<16> RF; // Resume Flag |
| Bitfield<14> NT; // Nested Task |
| Bitfield<13, 12> IOPL; // I/O Privilege Level |
| Bitfield<11> OF; // Overflow Flag |
| Bitfield<10> DF; // Direction Flag |
| Bitfield<9> IF; // Interrupt Flag |
| Bitfield<8> TF; // Trap Flag |
| Bitfield<7> SF; // Sign Flag |
| Bitfield<6> ZF; // Zero Flag |
| Bitfield<4> AF; // Auxiliary Flag |
| Bitfield<2> PF; // Parity Flag |
| Bitfield<0> CF; // Carry Flag |
| EndBitUnion(RFLAGS) |
| |
| /** |
| * Control registers |
| */ |
| BitUnion64(CR0) |
| Bitfield<31> PG; // Paging |
| Bitfield<30> CD; // Cache Disable |
| Bitfield<29> NW; // Not Writethrough |
| Bitfield<18> AM; // Alignment Mask |
| Bitfield<16> WP; // Write Protect |
| Bitfield<5> NE; // Numeric Error |
| Bitfield<4> ET; // Extension Type |
| Bitfield<3> TS; // Task Switched |
| Bitfield<2> EM; // Emulation |
| Bitfield<1> MP; // Monitor Coprocessor |
| Bitfield<0> PE; // Protection Enabled |
| EndBitUnion(CR0) |
| |
| // Page Fault Virtual Address |
| BitUnion64(CR2) |
| Bitfield<31, 0> legacy; |
| EndBitUnion(CR2) |
| |
| BitUnion64(CR3) |
| Bitfield<51, 12> longPDTB; // Long Mode Page-Directory-Table |
| // Base Address |
| Bitfield<31, 12> PDTB; // Non-PAE Addressing Page-Directory-Table |
| // Base Address |
| Bitfield<31, 5> PAEPDTB; // PAE Addressing Page-Directory-Table |
| // Base Address |
| Bitfield<4> PCD; // Page-Level Cache Disable |
| Bitfield<3> PWT; // Page-Level Writethrough |
| EndBitUnion(CR3) |
| |
| BitUnion64(CR4) |
| Bitfield<10> OSXMMEXCPT; // Operating System Unmasked |
| // Exception Support |
| Bitfield<9> OSFXSR; // Operating System FXSave/FSRSTOR Support |
| Bitfield<8> PCE; // Performance-Monitoring Counter Enable |
| Bitfield<7> PGE; // Page-Global Enable |
| Bitfield<6> MCE; // Machine Check Enable |
| Bitfield<5> PAE; // Physical-Address Extension |
| Bitfield<4> PSE; // Page Size Extensions |
| Bitfield<3> DE; // Debugging Extensions |
| Bitfield<2> TSD; // Time Stamp Disable |
| Bitfield<1> PVI; // Protected-Mode Virtual Interrupts |
| Bitfield<0> VME; // Virtual-8086 Mode Extensions |
| EndBitUnion(CR4) |
| |
| BitUnion64(CR8) |
| Bitfield<3, 0> TPR; // Task Priority Register |
| EndBitUnion(CR4) |
| |
| /** |
| * Segment Selector |
| */ |
| BitUnion64(SegSelector) |
| Bitfield<15, 3> SI; // Selector Index |
| Bitfield<2> TI; // Table Indicator |
| Bitfield<1, 0> RPL; // Requestor Privilege Level |
| EndBitUnion(SegSelector) |
| |
| /** |
| * Segment Descriptors |
| */ |
| |
| BitUnion64(SegDescriptor) |
| Bitfield<63, 56> baseHigh; |
| Bitfield<39, 16> baseLow; |
| Bitfield<55> G; // Granularity |
| Bitfield<54> D; // Default Operand Size |
| Bitfield<54> B; // Default Operand Size |
| Bitfield<53> L; // Long Attribute Bit |
| Bitfield<52> AVL; // Available To Software |
| Bitfield<51, 48> limitHigh; |
| Bitfield<15, 0> limitLow; |
| Bitfield<47> P; // Present |
| Bitfield<46, 45> DPL; // Descriptor Privilege-Level |
| Bitfield<44> S; // System |
| SubBitUnion(type, 43, 40) |
| // Specifies whether this descriptor is for code or data. |
| Bitfield<43> codeOrData; |
| |
| // These bit fields are for code segments |
| Bitfield<42> C; // Conforming |
| Bitfield<41> R; // Readable |
| |
| // These bit fields are for data segments |
| Bitfield<42> E; // Expand-Down |
| Bitfield<41> W; // Writable |
| |
| // This is used for both code and data segments. |
| Bitfield<40> A; // Accessed |
| EndSubBitUnion(type) |
| EndBitUnion(SegDescriptor) |
| |
| BitUnion64(GateDescriptor) |
| Bitfield<63, 48> offsetHigh; // Target Code-Segment Offset |
| Bitfield<15, 0> offsetLow; // Target Code-Segment Offset |
| Bitfield<31, 16> selector; // Target Code-Segment Selector |
| Bitfield<47> P; // Present |
| Bitfield<46, 45> DPL; // Descriptor Privilege-Level |
| Bitfield<43, 40> type; |
| Bitfield<36, 32> count; // Parameter Count |
| EndBitUnion(GateDescriptor) |
| |
| /** |
| * Descriptor-Table Registers |
| */ |
| BitUnion64(GDTR) |
| EndBitUnion(GDTR) |
| |
| BitUnion64(IDTR) |
| EndBitUnion(IDTR) |
| |
| BitUnion64(LDTR) |
| EndBitUnion(LDTR) |
| |
| /** |
| * Task Register |
| */ |
| BitUnion64(TR) |
| EndBitUnion(TR) |
| }; |
| |
| #endif // __ARCH_X86_INTREGS_HH__ |