Phoenix
Object-oriented orthogonally persistent operating system
|
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_ */