Phoenix
Object-oriented orthogonally persistent operating system
cpu_regs.h
Go to the documentation of this file.
00001 /*
00002  * /phoenix/kernel/sys/arch/x86_64/cpu_regs.h
00003  *
00004  * This file is a part of Phoenix operating system.
00005  * Copyright (c) 2011-2012, Artyom Lebedev <artyom.lebedev@gmail.com>
00006  * All rights reserved.
00007  * See COPYING file for copyright details.
00008  */
00009 
00014 #ifndef CPU_REGS_H_
00015 #define CPU_REGS_H_
00016 
00018 namespace cpu_reg {
00019 
00021 enum EflagsBits {
00022     EFLAGS_CF =     0x00000001,
00023     EFLAGS_PF =     0x00000004,
00024     EFLAGS_AF =     0x00000010,
00025     EFLAGS_ZF =     0x00000040,
00026     EFLAGS_SF =     0x00000080,
00027     EFLAGS_TF =     0x00000100,
00028     EFLAGS_IF =     0x00000200,
00029     EFLAGS_DF =     0x00000400,
00030     EFLAGS_OF =     0x00000800,
00031     EFLAGS_IOPL =   0x00003000,
00032     EFLAGS_NT =     0x00004000,
00033     EFLAGS_RF =     0x00010000,
00034     EFLAGS_VM =     0x00020000,
00035     EFLAGS_AC =     0x00040000,
00036     EFLAGS_VIF =    0x00080000,
00037     EFLAGS_VIP =    0x00100000,
00038     EFLAGS_ID =     0x00200000,
00039 };
00040 
00042 enum Cr0Bits {
00043     /*
00044      * Bits in 386 special registers:
00045      */
00046     CR0_PE =        0x00000001, 
00047     CR0_MP =        0x00000002, 
00048     CR0_EM =        0x00000004, 
00049     CR0_TS =        0x00000008, 
00050     CR0_PG =        0x80000000, 
00052     /*
00053      * Bits in 486 special registers:
00054      */
00055     CR0_NE =        0x00000020, 
00057     CR0_WP =        0x00010000,
00058     CR0_AM =        0x00040000, 
00059     CR0_NW =        0x20000000, 
00060     CR0_CD =        0x40000000  
00061 };
00062 
00064 enum Cr4Bits {
00065     CR4_VME =       0x00000001, 
00066     CR4_PVI =       0x00000002, 
00067     CR4_TSD =       0x00000004, 
00068     CR4_DE =        0x00000008, 
00069     CR4_PSE =       0x00000010, 
00070     CR4_PAE =       0x00000020, 
00071     CR4_MCE =       0x00000040, 
00072     CR4_PGE =       0x00000080, 
00073     CR4_PCE =       0x00000100, 
00074     CR4_FXSR =      0x00000200, 
00075     CR4_XMM =       0x00000400, 
00076     CR4_VMXE =      0x00002000, 
00077     CR4_SMXE =      0x00004000, 
00078     CR4_PCDIE =     0x00020000, 
00079 };
00080 
00082 enum CpuidBits {
00083     /*
00084      * CPUID instruction features register
00085      */
00086     CPUID_FPU =     0x00000001,
00087     CPUID_VME =     0x00000002,
00088     CPUID_DE =      0x00000004,
00089     CPUID_PSE =     0x00000008,
00090     CPUID_TSC =     0x00000010,
00091     CPUID_MSR =     0x00000020,
00092     CPUID_PAE =     0x00000040,
00093     CPUID_MCE =     0x00000080,
00094     CPUID_CX8 =     0x00000100,
00095     CPUID_APIC =    0x00000200,
00096     CPUID_B10 =     0x00000400,
00097     CPUID_SEP =     0x00000800,
00098     CPUID_MTRR =    0x00001000,
00099     CPUID_PGE =     0x00002000,
00100     CPUID_MCA =     0x00004000,
00101     CPUID_CMOV =    0x00008000,
00102     CPUID_PAT =     0x00010000,
00103     CPUID_PSE36 =   0x00020000,
00104     CPUID_PSN =     0x00040000,
00105     CPUID_CLFSH =   0x00080000,
00106     CPUID_B20 =     0x00100000,
00107     CPUID_DS =      0x00200000,
00108     CPUID_ACPI =    0x00400000,
00109     CPUID_MMX =     0x00800000,
00110     CPUID_FXSR =    0x01000000,
00111     CPUID_SSE =     0x02000000,
00112     CPUID_XMM =     0x02000000,
00113     CPUID_SSE2 =    0x04000000,
00114     CPUID_SS =      0x08000000,
00115     CPUID_HTT =     0x10000000,
00116     CPUID_TM =      0x20000000,
00117     CPUID_IA64 =    0x40000000,
00118     CPUID_PBE =     0x80000000,
00119 
00120     CPUID2_SSE3 =       0x00000001,
00121     CPUID2_PCLMULQDQ =  0x00000002,
00122     CPUID2_DTES64 =     0x00000004,
00123     CPUID2_MON =        0x00000008,
00124     CPUID2_DS_CPL =     0x00000010,
00125     CPUID2_VMX =        0x00000020,
00126     CPUID2_SMX =        0x00000040,
00127     CPUID2_EST =        0x00000080,
00128     CPUID2_TM2 =        0x00000100,
00129     CPUID2_SSSE3 =      0x00000200,
00130     CPUID2_CNXTID =     0x00000400,
00131     CPUID2_CX16 =       0x00002000,
00132     CPUID2_XTPR =       0x00004000,
00133     CPUID2_PDCM =       0x00008000,
00134     CPUID2_DCA =        0x00040000,
00135     CPUID2_SSE41 =      0x00080000,
00136     CPUID2_SSE42 =      0x00100000,
00137     CPUID2_X2APIC =     0x00200000,
00138     CPUID2_POPCNT =     0x00800000,
00139 
00140     /*
00141      * CPUID instruction 1 ebx info
00142      */
00143     CPUID_BRAND_INDEX =     0x000000ff,
00144     CPUID_CLFUSH_SIZE =     0x0000ff00,
00145     CPUID_HTT_CORES =       0x00ff0000,
00146     CPUID_LOCAL_APIC_ID =   0xff000000,
00147 
00148     /*
00149      * CPUID instruction 0xb ebx info.
00150      */
00151     CPUID_TYPE_INVAL =      0,
00152     CPUID_TYPE_SMT =        1,
00153     CPUID_TYPE_CORE =       2,
00154 
00155     /*
00156      * CPUID instruction 0x80000001 edx info.
00157      */
00158     CPUID_EFEAT_SYSCALL =   (1 << 11), 
00159     CPUID_EFEAT_NX =        (1 << 20), 
00160     CPUID_EFEAT_RDTSCP =    (1 << 27), 
00161     CPUID_EFEAT_IA64 =      (1 << 29), 
00162 };
00163 
00164 /*
00165  * CPUID instruction 1 eax info
00166  */
00167 #define CPUID_STEPPING      0x0000000f
00168 #define CPUID_MODEL         0x000000f0
00169 #define CPUID_FAMILY        0x00000f00
00170 #define CPUID_EXT_MODEL     0x000f0000
00171 #define CPUID_EXT_FAMILY    0x0ff00000
00172 #define CPUID_TO_MODEL(id) \
00173     ((((id) & CPUID_MODEL) >> 4) | \
00174     ((((id) & CPUID_FAMILY) >= 0x600,) ? \
00175     (((id) & CPUID_EXT_MODEL) >> 12) : 0))
00176 #define CPUID_TO_FAMILY(id) \
00177     ((((id) & CPUID_FAMILY) >> 8) + \
00178     ((((id) & CPUID_FAMILY) == 0xf00,) ? \
00179     (((id) & CPUID_EXT_FAMILY) >> 20) : 0))
00180 
00181 
00182 /*
00183  * CPUID manufacturers identifiers
00184  */
00185 #define AMD_VENDOR_ID       "AuthenticAMD"
00186 #define CENTAUR_VENDOR_ID   "CentaurHauls"
00187 #define CYRIX_VENDOR_ID     "CyrixInstead"
00188 #define INTEL_VENDOR_ID     "GenuineIntel"
00189 #define NEXGEN_VENDOR_ID    "NexGenDriven"
00190 #define NSC_VENDOR_ID       "Geode by NSC"
00191 #define RISE_VENDOR_ID      "RiseRiseRise"
00192 #define SIS_VENDOR_ID       "SiS SiS SiS "
00193 #define TRANSMETA_VENDOR_ID "GenuineTMx86"
00194 #define UMC_VENDOR_ID       "UMC UMC UMC "
00195 
00197 enum MsrRegs {
00198     MSR_P5_MC_ADDR =        0x000,
00199     MSR_P5_MC_TYPE =        0x001,
00200     MSR_TSC =               0x010,
00201     MSR_P5_CESR =           0x011,
00202     MSR_P5_CTR0 =           0x012,
00203     MSR_P5_CTR1 =           0x013,
00204     MSR_IA32_PLATFORM_ID =  0x017,
00205     MSR_APICBASE =          0x01b,
00206     MSR_EBL_CR_POWERON =    0x02a,
00207     MSR_TEST_CTL =          0x033,
00208     MSR_BIOS_UPDT_TRIG =    0x079,
00209     MSR_BBL_CR_D0 =         0x088,
00210     MSR_BBL_CR_D1 =         0x089,
00211     MSR_BBL_CR_D2 =         0x08a,
00212     MSR_BIOS_SIGN =         0x08b,
00213     MSR_PERFCTR0 =          0x0c1,
00214     MSR_PERFCTR1 =          0x0c2,
00215     MSR_IA32_EXT_CONFIG =   0x0ee,  /* Undocumented. Core Solo/Duo only. */
00216     MSR_MTRRcap =           0x0fe,
00217     MSR_BBL_CR_ADDR =       0x116,
00218     MSR_BBL_CR_DECC =       0x118,
00219     MSR_BBL_CR_CTL =        0x119,
00220     MSR_BBL_CR_TRIG =       0x11a,
00221     MSR_BBL_CR_BUSY =       0x11b,
00222     MSR_BBL_CR_CTL3 =       0x11e,
00223     MSR_SYSENTER_CS_MSR =   0x174,
00224     MSR_SYSENTER_ESP_MSR =  0x175,
00225     MSR_SYSENTER_EIP_MSR =  0x176,
00226     MSR_MCG_CAP =           0x179,
00227     MSR_MCG_STATUS =        0x17a,
00228     MSR_MCG_CTL =           0x17b,
00229     MSR_EVNTSEL0 =          0x186,
00230     MSR_EVNTSEL1 =          0x187,
00231     MSR_THERM_CONTROL =     0x19a,
00232     MSR_THERM_INTERRUPT =   0x19b,
00233     MSR_THERM_STATUS =      0x19c,
00234     MSR_IA32_MISC_ENABLE =  0x1a0,
00235     MSR_DEBUGCTLMSR =       0x1d9,
00236     MSR_LASTBRANCHFROMIP =  0x1db,
00237     MSR_LASTBRANCHTOIP =    0x1dc,
00238     MSR_LASTINTFROMIP =     0x1dd,
00239     MSR_LASTINTTOIP =       0x1de,
00240     MSR_ROB_CR_BKUPTMPDR6 = 0x1e0,
00241     MSR_MTRRVarBase =       0x200,
00242     MSR_MTRR64kBase =       0x250,
00243     MSR_MTRR16kBase =       0x258,
00244     MSR_MTRR4kBase =        0x268,
00245     MSR_PAT =               0x277,
00246     MSR_MTRRdefType =       0x2ff,
00247     MSR_MC0_CTL =           0x400,
00248     MSR_MC0_STATUS =        0x401,
00249     MSR_MC0_ADDR =          0x402,
00250     MSR_MC0_MISC =          0x403,
00251     MSR_MC1_CTL =           0x404,
00252     MSR_MC1_STATUS =        0x405,
00253     MSR_MC1_ADDR =          0x406,
00254     MSR_MC1_MISC =          0x407,
00255     MSR_MC2_CTL =           0x408,
00256     MSR_MC2_STATUS =        0x409,
00257     MSR_MC2_ADDR =          0x40a,
00258     MSR_MC2_MISC =          0x40b,
00259     MSR_MC3_CTL =           0x40c,
00260     MSR_MC3_STATUS =        0x40d,
00261     MSR_MC3_ADDR =          0x40e,
00262     MSR_MC3_MISC =          0x40f,
00263     MSR_MC4_CTL =           0x410,
00264     MSR_MC4_STATUS =        0x411,
00265     MSR_MC4_ADDR =          0x412,
00266     MSR_MC4_MISC =          0x413,
00267     MSR_IA32_EFER =         0xc0000080,
00268 };
00269 
00271 enum Ia32eferBits {
00272     IA32_EFER_SCE =         0x001, 
00273     IA32_EFER_LME =         0x100, 
00274     IA32_EFER_LMA =         0x400, 
00275     IA32_EFER_NXE =         0x800, 
00276 };
00277 
00279 enum ApicBaseBits {
00280     APICBASE_RESERVED =     0x0000006ff,
00281     APICBASE_BSP =          0x000000100,
00282     APICBASE_ENABLED =      0x000000800,
00283     APICBASE_ADDRESS =      0xffffff000,
00284 };
00285 
00287 enum PatModes {
00288     PAT_UNCACHEABLE =       0x00,
00289     PAT_WRITE_COMBINING =   0x01,
00290     PAT_WRITE_THROUGH =     0x04,
00291     PAT_WRITE_PROTECTED =   0x05,
00292     PAT_WRITE_BACK =        0x06,
00293     PAT_UNCACHED =          0x07
00294 };
00295 
00296 #define PAT_VALUE(i, m)     ((u8)(m) << (8 * (i)))
00297 #define PAT_MASK(i)         PAT_VALUE(i, 0xff)
00298 
00300 enum MtrrConsts {
00301     MTRR_UNCACHEABLE =          0x00,
00302     MTRR_WRITE_COMBINING =      0x01,
00303     MTRR_WRITE_THROUGH =        0x04,
00304     MTRR_WRITE_PROTECTED =      0x05,
00305     MTRR_WRITE_BACK =           0x06,
00306     MTRR_N64K =                 8,      /* numbers of fixed-size entries */
00307     MTRR_N16K =                 16,
00308     MTRR_N4K =                  64,
00309     MTRR_CAP_WC =               0x0000000000000400UL,
00310     MTRR_CAP_FIXED =            0x0000000000000100UL,
00311     MTRR_CAP_VCNT =             0x00000000000000ffUL,
00312     MTRR_DEF_ENABLE =           0x0000000000000800UL,
00313     MTRR_DEF_FIXED_ENABLE =     0x0000000000000400UL,
00314     MTRR_DEF_TYPE =             0x00000000000000ffUL,
00315     MTRR_PHYSBASE_PHYSBASE =    0x000ffffffffff000UL,
00316     MTRR_PHYSBASE_TYPE =        0x00000000000000ffUL,
00317     MTRR_PHYSMASK_PHYSMASK =    0x000ffffffffff000UL,
00318     MTRR_PHYSMASK_VALID =       0x0000000000000800UL,
00319 };
00320 
00322 enum Pcr0Bits {
00323     PCR0 =          0x20,
00324     PCR0_RSTK =     0x01,   
00325     PCR0_BTB =      0x02,   
00326     PCR0_LOOP =     0x04,   
00327     PCR0_AIS =      0x08,   
00328     PCR0_MLR =      0x10,   
00329     PCR0_BTBRT =    0x40,   
00330     PCR0_LSSER =    0x80,   
00331 };
00332 
00334 enum DirRegs {
00335     DIR0 =          0xfe,
00336     DIR1 =          0xff,
00337 };
00338 
00340 enum McRegConsts {
00341     MCG_CAP_COUNT =         0x000000ff,
00342     MCG_CAP_CTL_P =         0x00000100,
00343     MCG_CAP_EXT_P =         0x00000200,
00344     MCG_CAP_TES_P =         0x00000800,
00345     MCG_CAP_EXT_CNT =       0x00ff0000,
00346     MCG_STATUS_RIPV =       0x00000001,
00347     MCG_STATUS_EIPV =       0x00000002,
00348     MCG_STATUS_MCIP =       0x00000004,
00349     MCG_CTL_ENABLE =        0xffffffffffffffffUL,
00350     MCG_CTL_DISABLE =       0x0000000000000000UL,
00351     MC_STATUS_MCA_ERROR =   0x000000000000ffffUL,
00352     MC_STATUS_MODEL_ERROR = 0x00000000ffff0000UL,
00353     MC_STATUS_OTHER_INFO =  0x01ffffff00000000UL,
00354     MC_STATUS_PCC =         0x0200000000000000UL,
00355     MC_STATUS_ADDRV =       0x0400000000000000UL,
00356     MC_STATUS_MISCV =       0x0800000000000000UL,
00357     MC_STATUS_EN =          0x1000000000000000UL,
00358     MC_STATUS_UC =          0x2000000000000000UL,
00359     MC_STATUS_OVER =        0x4000000000000000UL,
00360     MC_STATUS_VAL =         0x8000000000000000UL,
00361 };
00362 
00363 #define MSR_MC_CTL(x)       (MSR_MC0_CTL + (x) * 4)
00364 #define MSR_MC_STATUS(x)    (MSR_MC0_STATUS + (x) * 4)
00365 #define MSR_MC_ADDR(x)      (MSR_MC0_ADDR + (x) * 4)
00366 #define MSR_MC_MISC(x)      (MSR_MC0_MISC + (x) * 4)
00367 
00379 enum NcrConsts {
00380     NCR1 =              0xc4,
00381     NCR2 =              0xc7,
00382     NCR3 =              0xca,
00383     NCR4 =              0xcd,
00384 
00385     NCR_SIZE_0K =       0,
00386     NCR_SIZE_4K =       1,
00387     NCR_SIZE_8K =       2,
00388     NCR_SIZE_16K =      3,
00389     NCR_SIZE_32K =      4,
00390     NCR_SIZE_64K =      5,
00391     NCR_SIZE_128K =     6,
00392     NCR_SIZE_256K =     7,
00393     NCR_SIZE_512K =     8,
00394     NCR_SIZE_1M =       9,
00395     NCR_SIZE_2M =       10,
00396     NCR_SIZE_4M =       11,
00397     NCR_SIZE_8M =       12,
00398     NCR_SIZE_16M =      13,
00399     NCR_SIZE_32M =      14,
00400     NCR_SIZE_4G =       15,
00401 };
00402 
00411 enum ArrConsts {
00412     ARR0 =              0xc4,
00413     ARR1 =              0xc7,
00414     ARR2 =              0xca,
00415     ARR3 =              0xcd,
00416     ARR4 =              0xd0,
00417     ARR5 =              0xd3,
00418     ARR6 =              0xd6,
00419     ARR7 =              0xd9,
00420 
00421     ARR_SIZE_0K =       0,
00422     ARR_SIZE_4K =       1,
00423     ARR_SIZE_8K =       2,
00424     ARR_SIZE_16K =      3,
00425     ARR_SIZE_32K =      4,
00426     ARR_SIZE_64K =      5,
00427     ARR_SIZE_128K =     6,
00428     ARR_SIZE_256K =     7,
00429     ARR_SIZE_512K =     8,
00430     ARR_SIZE_1M =       9,
00431     ARR_SIZE_2M =       10,
00432     ARR_SIZE_4M =       11,
00433     ARR_SIZE_8M =       12,
00434     ARR_SIZE_16M =      13,
00435     ARR_SIZE_32M =      14,
00436     ARR_SIZE_4G =       15,
00437 };
00438 
00443 enum RcrConsts {
00444     RCR0 =          0xdc,
00445     RCR1 =          0xdd,
00446     RCR2 =          0xde,
00447     RCR3 =          0xdf,
00448     RCR4 =          0xe0,
00449     RCR5 =          0xe1,
00450     RCR6 =          0xe2,
00451     RCR7 =          0xe3,
00452 
00453     RCR_RCD =       0x01,   
00454     RCR_RCE =       0x01,   
00455     RCR_WWO =       0x02,   
00456     RCR_WL =        0x04,   
00457     RCR_WG =        0x08,   
00458     RCR_WT =        10,     
00459     RCR_NLB =       20,     
00460 };
00461 
00462 } /* namespace cpu_reg */
00463 
00464 #endif /* CPU_REGS_H_ */
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines