PageRenderTime 62ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/open-vm-tools/lib/include/x86cpuid.h

https://bitbucket.org/nizard/open-vm-tools
C Header | 1466 lines | 985 code | 168 blank | 313 comment | 107 complexity | d9906aed8526086de680f68a42a6262e MD5 | raw file
Possible License(s): GPL-2.0, MPL-2.0-no-copyleft-exception, LGPL-2.1, BSD-3-Clause

Large files files are truncated, but you can click here to view the full file

  1. /*********************************************************
  2. * Copyright (C) 1998-2012 VMware, Inc. All rights reserved.
  3. *
  4. * This program is free software; you can redistribute it and/or modify it
  5. * under the terms of the GNU Lesser General Public License as published
  6. * by the Free Software Foundation version 2.1 and no later version.
  7. *
  8. * This program is distributed in the hope that it will be useful, but
  9. * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  10. * or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU General Public
  11. * License for more details.
  12. *
  13. * You should have received a copy of the GNU Lesser General Public License
  14. * along with this program; if not, write to the Free Software Foundation, Inc.,
  15. * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  16. *
  17. *********************************************************/
  18. /*********************************************************
  19. * The contents of this file are subject to the terms of the Common
  20. * Development and Distribution License (the "License") version 1.0
  21. * and no later version. You may not use this file except in
  22. * compliance with the License.
  23. *
  24. * You can obtain a copy of the License at
  25. * http://www.opensource.org/licenses/cddl1.php
  26. *
  27. * See the License for the specific language governing permissions
  28. * and limitations under the License.
  29. *
  30. *********************************************************/
  31. #ifndef _X86CPUID_H_
  32. #define _X86CPUID_H_
  33. /* http://www.sandpile.org/ia32/cpuid.htm */
  34. #define INCLUDE_ALLOW_USERLEVEL
  35. #define INCLUDE_ALLOW_VMX
  36. #define INCLUDE_ALLOW_VMKERNEL
  37. #define INCLUDE_ALLOW_MODULE
  38. #define INCLUDE_ALLOW_DISTRIBUTE
  39. #define INCLUDE_ALLOW_VMK_MODULE
  40. #define INCLUDE_ALLOW_VMCORE
  41. #define INCLUDE_ALLOW_VMMON
  42. #include "includeCheck.h"
  43. #include "vm_basic_types.h"
  44. #include "community_source.h"
  45. #include "x86vendor.h"
  46. #include "vm_assert.h"
  47. /*
  48. * The linux kernel's ptrace.h stupidly defines the bare
  49. * EAX/EBX/ECX/EDX, which wrecks havoc with our preprocessor tricks.
  50. */
  51. #undef EAX
  52. #undef EBX
  53. #undef ECX
  54. #undef EDX
  55. typedef struct CPUIDRegs {
  56. uint32 eax, ebx, ecx, edx;
  57. } CPUIDRegs;
  58. typedef union CPUIDRegsUnion {
  59. uint32 array[4];
  60. CPUIDRegs regs;
  61. } CPUIDRegsUnion;
  62. /*
  63. * Results of calling cpuid(eax, ecx) on all host logical CPU.
  64. */
  65. #ifdef _MSC_VER
  66. #pragma warning (disable :4200) // non-std extension: zero-sized array in struct
  67. #endif
  68. typedef
  69. #include "vmware_pack_begin.h"
  70. struct CPUIDReply {
  71. /*
  72. * Unique host logical CPU identifier. It does not change across queries, so
  73. * we use it to correlate the replies of multiple queries.
  74. */
  75. uint64 tag; // OUT
  76. CPUIDRegs regs; // OUT
  77. }
  78. #include "vmware_pack_end.h"
  79. CPUIDReply;
  80. typedef
  81. #include "vmware_pack_begin.h"
  82. struct CPUIDQuery {
  83. uint32 eax; // IN
  84. uint32 ecx; // IN
  85. uint32 numLogicalCPUs; // IN/OUT
  86. CPUIDReply logicalCPUs[0]; // OUT
  87. }
  88. #include "vmware_pack_end.h"
  89. CPUIDQuery;
  90. /*
  91. * CPUID levels the monitor caches and ones that are not cached, but
  92. * have fields defined below (short name and actual value).
  93. *
  94. * The first parameter defines whether the level has its default masks
  95. * generated from the values in this file. Any level which is marked
  96. * as FALSE here *must* have all monitor support types set to NA. A
  97. * static assert in lib/cpuidcompat/cpuidcompat.c will check this.
  98. */
  99. #define CPUID_CACHED_LEVELS \
  100. CPUIDLEVEL(TRUE, 0, 0) \
  101. CPUIDLEVEL(TRUE, 1, 1) \
  102. CPUIDLEVEL(FALSE, 5, 5) \
  103. CPUIDLEVEL(TRUE, 7, 7) \
  104. CPUIDLEVEL(FALSE, A, 0xA) \
  105. CPUIDLEVEL(TRUE, D, 0xD) \
  106. CPUIDLEVEL(FALSE,400, 0x40000000) \
  107. CPUIDLEVEL(FALSE,401, 0x40000001) \
  108. CPUIDLEVEL(FALSE,402, 0x40000002) \
  109. CPUIDLEVEL(FALSE,403, 0x40000003) \
  110. CPUIDLEVEL(FALSE,404, 0x40000004) \
  111. CPUIDLEVEL(FALSE,410, 0x40000010) \
  112. CPUIDLEVEL(FALSE, 80, 0x80000000) \
  113. CPUIDLEVEL(TRUE, 81, 0x80000001) \
  114. CPUIDLEVEL(FALSE, 87, 0x80000007) \
  115. CPUIDLEVEL(FALSE, 88, 0x80000008) \
  116. CPUIDLEVEL(TRUE, 8A, 0x8000000A)
  117. #define CPUID_UNCACHED_LEVELS \
  118. CPUIDLEVEL(FALSE, 4, 4) \
  119. CPUIDLEVEL(FALSE, 6, 6) \
  120. CPUIDLEVEL(FALSE, B, 0xB) \
  121. CPUIDLEVEL(FALSE, 85, 0x80000005) \
  122. CPUIDLEVEL(FALSE, 86, 0x80000006) \
  123. CPUIDLEVEL(FALSE, 819, 0x80000019) \
  124. CPUIDLEVEL(FALSE, 81A, 0x8000001A) \
  125. CPUIDLEVEL(FALSE, 81B, 0x8000001B) \
  126. CPUIDLEVEL(FALSE, 81C, 0x8000001C) \
  127. CPUIDLEVEL(FALSE, 81D, 0x8000001D) \
  128. CPUIDLEVEL(FALSE, 81E, 0x8000001E)
  129. #define CPUID_ALL_LEVELS \
  130. CPUID_CACHED_LEVELS \
  131. CPUID_UNCACHED_LEVELS
  132. /* Define cached CPUID levels in the form: CPUID_LEVEL_<ShortName> */
  133. typedef enum {
  134. #define CPUIDLEVEL(t, s, v) CPUID_LEVEL_##s,
  135. CPUID_CACHED_LEVELS
  136. #undef CPUIDLEVEL
  137. CPUID_NUM_CACHED_LEVELS
  138. } CpuidCachedLevel;
  139. /* Enum to translate between shorthand name and actual CPUID level value. */
  140. enum {
  141. #define CPUIDLEVEL(t, s, v) CPUID_LEVEL_VAL_##s = v,
  142. CPUID_ALL_LEVELS
  143. #undef CPUIDLEVEL
  144. };
  145. /* Named feature leaves */
  146. #define CPUID_MWAIT_FEATURES 5
  147. #define CPUID_SVM_FEATURES 0x8000000a
  148. /*
  149. * CPUID result registers
  150. */
  151. #define CPUID_REGS \
  152. CPUIDREG(EAX, eax) \
  153. CPUIDREG(EBX, ebx) \
  154. CPUIDREG(ECX, ecx) \
  155. CPUIDREG(EDX, edx)
  156. typedef enum {
  157. #define CPUIDREG(uc, lc) CPUID_REG_##uc,
  158. CPUID_REGS
  159. #undef CPUIDREG
  160. CPUID_NUM_REGS
  161. } CpuidReg;
  162. #define CPUID_INTEL_VENDOR_STRING "GenuntelineI"
  163. #define CPUID_AMD_VENDOR_STRING "AuthcAMDenti"
  164. #define CPUID_CYRIX_VENDOR_STRING "CyriteadxIns"
  165. #define CPUID_VIA_VENDOR_STRING "CentaulsaurH"
  166. #define CPUID_HYPERV_HYPERVISOR_VENDOR_STRING "Microsoft Hv"
  167. #define CPUID_KVM_HYPERVISOR_VENDOR_STRING "KVMKVMKVM\0\0\0"
  168. #define CPUID_VMWARE_HYPERVISOR_VENDOR_STRING "VMwareVMware"
  169. #define CPUID_XEN_HYPERVISOR_VENDOR_STRING "XenVMMXenVMM"
  170. #define CPUID_INTEL_VENDOR_STRING_FIXED "GenuineIntel"
  171. #define CPUID_AMD_VENDOR_STRING_FIXED "AuthenticAMD"
  172. #define CPUID_CYRIX_VENDOR_STRING_FIXED "CyrixInstead"
  173. #define CPUID_VIA_VENDOR_STRING_FIXED "CentaurHauls"
  174. /*
  175. * FIELD can be defined to process the CPUID information provided
  176. * in the following CPUID_FIELD_DATA macro. The first parameter is
  177. * the CPUID level of the feature (must be defined in
  178. * CPUID_ALL_LEVELS, above. The second parameter is the CPUID result
  179. * register in which the field is returned (defined in CPUID_REGS).
  180. * The third field is the vendor(s) this feature applies to. "COMMON"
  181. * means all vendors apply. UNKNOWN may not be used here. The fourth
  182. * and fifth parameters are the bit position of the field and the
  183. * width, respectively. The sixth is the text name of the field.
  184. *
  185. * The seventh parameters specifies the monitor support
  186. * characteristics for this field. The value must be a valid
  187. * CpuidFieldSupported value (omitting CPUID_FIELD_SUPPORT_ for
  188. * convenience). The meaning of those values are described below.
  189. *
  190. * The eighth parameter describes whether the feature is capable of
  191. * being used by usermode code (TRUE), or just CPL0 kernel code
  192. * (FALSE).
  193. *
  194. * FLAG is defined identically to FIELD, but its accessors are more
  195. * appropriate for 1-bit flags, and compile-time asserts enforce that
  196. * the size is 1 bit wide.
  197. */
  198. /*
  199. * CpuidFieldSupported is made up of the following values:
  200. *
  201. * NO: A feature/field that IS NOT SUPPORTED by the monitor. Even
  202. * if the host supports this feature, we will never expose it to
  203. * the guest.
  204. *
  205. * YES: A feature/field that IS SUPPORTED by the monitor. If the
  206. * host supports this feature, we will expose it to the guest. If
  207. * not, then we will not set the feature.
  208. *
  209. * ANY: A feature/field that IS ALWAYS SUPPORTED by the monitor.
  210. * Even if the host does not support the feature, the monitor can
  211. * expose the feature to the guest.
  212. *
  213. * NA: Only legal for levels not masked/tested by default (see
  214. * above for this definition). Such fields must always be marked
  215. * as NA.
  216. *
  217. * These distinctions, when combined with the feature's CPL3
  218. * properties can be translated into a common CPUID mask string as
  219. * follows:
  220. *
  221. * NO + CPL3 --> "R" (Reserved). We don't support the feature,
  222. * but we can't properly hide this from applications when using
  223. * direct execution or HV with apps that do try/catch/fail, so we
  224. * must still perform compatibility checks.
  225. *
  226. * NO + !CPL3 --> "0" (Masked). We can hide this from the guest.
  227. *
  228. * YES --> "H" (Host). We support the feature, so show it to the
  229. * guest if the host has the feature.
  230. *
  231. * ANY/NA --> "X" (Ignore). By default, don't perform checks for
  232. * this feature bit. Per-GOS masks may choose to set this bit in
  233. * the guest. (e.g. the APIC feature bit is always set to 1.)
  234. *
  235. * See lib/cpuidcompat/cpuidcompat.c for any possible overrides to
  236. * these defaults.
  237. */
  238. typedef enum {
  239. CPUID_FIELD_SUPPORTED_NO,
  240. CPUID_FIELD_SUPPORTED_YES,
  241. CPUID_FIELD_SUPPORTED_ANY,
  242. CPUID_FIELD_SUPPORTED_NA,
  243. CPUID_NUM_FIELD_SUPPORTEDS
  244. } CpuidFieldSupported;
  245. /* LEVEL, SUB-LEVEL, REG, VENDOR, POS, SIZE, NAME, MON SUPP, CPL3 */
  246. #define CPUID_FIELD_DATA_LEVEL_0 \
  247. FIELD( 0, 0, EAX, COMMON, 0, 32, NUMLEVELS, ANY, FALSE) \
  248. FIELD( 0, 0, EBX, COMMON, 0, 32, VENDOR1, YES, TRUE) \
  249. FIELD( 0, 0, ECX, COMMON, 0, 32, VENDOR3, YES, TRUE) \
  250. FIELD( 0, 0, EDX, COMMON, 0, 32, VENDOR2, YES, TRUE)
  251. /* LEVEL, SUB-LEVEL, REG, VENDOR, POS, SIZE, NAME, MON SUPP, CPL3 */
  252. #define CPUID_FIELD_DATA_LEVEL_1 \
  253. FIELD( 1, 0, EAX, COMMON, 0, 4, STEPPING, ANY, FALSE) \
  254. FIELD( 1, 0, EAX, COMMON, 4, 4, MODEL, ANY, FALSE) \
  255. FIELD( 1, 0, EAX, COMMON, 8, 4, FAMILY, YES, FALSE) \
  256. FIELD( 1, 0, EAX, COMMON, 12, 2, TYPE, ANY, FALSE) \
  257. FIELD( 1, 0, EAX, COMMON, 16, 4, EXTENDED_MODEL, ANY, FALSE) \
  258. FIELD( 1, 0, EAX, COMMON, 20, 8, EXTENDED_FAMILY, YES, FALSE) \
  259. FIELD( 1, 0, EBX, COMMON, 0, 8, BRAND_ID, ANY, FALSE) \
  260. FIELD( 1, 0, EBX, COMMON, 8, 8, CLFL_SIZE, ANY, FALSE) \
  261. FIELD( 1, 0, EBX, COMMON, 16, 8, LCPU_COUNT, ANY, FALSE) \
  262. FIELD( 1, 0, EBX, COMMON, 24, 8, APICID, ANY, FALSE) \
  263. FLAG( 1, 0, ECX, COMMON, 0, 1, SSE3, YES, TRUE) \
  264. FLAG( 1, 0, ECX, COMMON, 1, 1, PCLMULQDQ, YES, TRUE) \
  265. FLAG( 1, 0, ECX, INTEL, 2, 1, DTES64, NO, FALSE) \
  266. FLAG( 1, 0, ECX, COMMON, 3, 1, MWAIT, YES, FALSE) \
  267. FLAG( 1, 0, ECX, INTEL, 4, 1, DSCPL, NO, FALSE) \
  268. FLAG( 1, 0, ECX, INTEL, 5, 1, VMX, YES, FALSE) \
  269. FLAG( 1, 0, ECX, INTEL, 6, 1, SMX, NO, FALSE) \
  270. FLAG( 1, 0, ECX, INTEL, 7, 1, EIST, NO, FALSE) \
  271. FLAG( 1, 0, ECX, INTEL, 8, 1, TM2, NO, FALSE) \
  272. FLAG( 1, 0, ECX, COMMON, 9, 1, SSSE3, YES, TRUE) \
  273. FLAG( 1, 0, ECX, INTEL, 10, 1, CNXTID, NO, FALSE) \
  274. FLAG( 1, 0, ECX, INTEL, 11, 1, NDA11, NO, FALSE) \
  275. FLAG( 1, 0, ECX, COMMON, 12, 1, FMA, YES, TRUE) \
  276. FLAG( 1, 0, ECX, COMMON, 13, 1, CMPXCHG16B, YES, TRUE) \
  277. FLAG( 1, 0, ECX, INTEL, 14, 1, xTPR, NO, FALSE) \
  278. FLAG( 1, 0, ECX, INTEL, 15, 1, PDCM, NO, FALSE) \
  279. FLAG( 1, 0, ECX, INTEL, 17, 1, PCID, YES, FALSE) \
  280. FLAG( 1, 0, ECX, INTEL, 18, 1, DCA, NO, FALSE) \
  281. FLAG( 1, 0, ECX, COMMON, 19, 1, SSE41, YES, TRUE) \
  282. FLAG( 1, 0, ECX, COMMON, 20, 1, SSE42, YES, TRUE) \
  283. FLAG( 1, 0, ECX, COMMON, 21, 1, x2APIC, ANY, FALSE) \
  284. FLAG( 1, 0, ECX, INTEL, 22, 1, MOVBE, YES, TRUE) \
  285. FLAG( 1, 0, ECX, COMMON, 23, 1, POPCNT, YES, TRUE) \
  286. FLAG( 1, 0, ECX, COMMON, 24, 1, TSC_DEADLINE, NO, FALSE) \
  287. FLAG( 1, 0, ECX, COMMON, 25, 1, AES, YES, TRUE) \
  288. FLAG( 1, 0, ECX, COMMON, 26, 1, XSAVE, YES, FALSE) \
  289. FLAG( 1, 0, ECX, COMMON, 27, 1, OSXSAVE, ANY, FALSE) \
  290. FLAG( 1, 0, ECX, COMMON, 28, 1, AVX, YES, FALSE) \
  291. FLAG( 1, 0, ECX, COMMON, 29, 1, F16C, YES, TRUE) \
  292. FLAG( 1, 0, ECX, COMMON, 30, 1, RDRAND, YES, TRUE) \
  293. FLAG( 1, 0, ECX, COMMON, 31, 1, HYPERVISOR, ANY, TRUE) \
  294. FLAG( 1, 0, EDX, COMMON, 0, 1, FPU, YES, TRUE) \
  295. FLAG( 1, 0, EDX, COMMON, 1, 1, VME, YES, FALSE) \
  296. FLAG( 1, 0, EDX, COMMON, 2, 1, DE, YES, FALSE) \
  297. FLAG( 1, 0, EDX, COMMON, 3, 1, PSE, YES, FALSE) \
  298. FLAG( 1, 0, EDX, COMMON, 4, 1, TSC, YES, TRUE) \
  299. FLAG( 1, 0, EDX, COMMON, 5, 1, MSR, YES, FALSE) \
  300. FLAG( 1, 0, EDX, COMMON, 6, 1, PAE, YES, FALSE) \
  301. FLAG( 1, 0, EDX, COMMON, 7, 1, MCE, YES, FALSE) \
  302. FLAG( 1, 0, EDX, COMMON, 8, 1, CX8, YES, TRUE) \
  303. FLAG( 1, 0, EDX, COMMON, 9, 1, APIC, ANY, FALSE) \
  304. FLAG( 1, 0, EDX, COMMON, 11, 1, SEP, YES, TRUE) \
  305. FLAG( 1, 0, EDX, COMMON, 12, 1, MTRR, YES, FALSE) \
  306. FLAG( 1, 0, EDX, COMMON, 13, 1, PGE, YES, FALSE) \
  307. FLAG( 1, 0, EDX, COMMON, 14, 1, MCA, YES, FALSE) \
  308. FLAG( 1, 0, EDX, COMMON, 15, 1, CMOV, YES, TRUE) \
  309. FLAG( 1, 0, EDX, COMMON, 16, 1, PAT, YES, FALSE) \
  310. FLAG( 1, 0, EDX, COMMON, 17, 1, PSE36, YES, FALSE) \
  311. FLAG( 1, 0, EDX, INTEL, 18, 1, PSN, YES, FALSE) \
  312. FLAG( 1, 0, EDX, COMMON, 19, 1, CLFSH, YES, TRUE) \
  313. FLAG( 1, 0, EDX, INTEL, 21, 1, DS, YES, FALSE) \
  314. FLAG( 1, 0, EDX, INTEL, 22, 1, ACPI, ANY, FALSE) \
  315. FLAG( 1, 0, EDX, COMMON, 23, 1, MMX, YES, TRUE) \
  316. FLAG( 1, 0, EDX, COMMON, 24, 1, FXSR, YES, TRUE) \
  317. FLAG( 1, 0, EDX, COMMON, 25, 1, SSE, YES, TRUE) \
  318. FLAG( 1, 0, EDX, COMMON, 26, 1, SSE2, YES, TRUE) \
  319. FLAG( 1, 0, EDX, INTEL, 27, 1, SS, YES, FALSE) \
  320. FLAG( 1, 0, EDX, COMMON, 28, 1, HTT, ANY, FALSE) \
  321. FLAG( 1, 0, EDX, INTEL, 29, 1, TM, NO, FALSE) \
  322. FLAG( 1, 0, EDX, INTEL, 30, 1, IA64, NO, FALSE) \
  323. FLAG( 1, 0, EDX, INTEL, 31, 1, PBE, NO, FALSE)
  324. /* LEVEL, SUB-LEVEL, REG, VENDOR, POS, SIZE, NAME, MON SUPP, CPL3 */
  325. #define CPUID_FIELD_DATA_LEVEL_4 \
  326. FIELD( 4, 0, EAX, INTEL, 0, 5, LEAF4_CACHE_TYPE, NA, FALSE) \
  327. FIELD( 4, 0, EAX, INTEL, 5, 3, LEAF4_CACHE_LEVEL, NA, FALSE) \
  328. FLAG( 4, 0, EAX, INTEL, 8, 1, LEAF4_CACHE_SELF_INIT, NA, FALSE) \
  329. FLAG( 4, 0, EAX, INTEL, 9, 1, LEAF4_CACHE_FULLY_ASSOC, NA, FALSE) \
  330. FIELD( 4, 0, EAX, INTEL, 14, 12, LEAF4_CACHE_NUMHT_SHARING, NA, FALSE) \
  331. FIELD( 4, 0, EAX, INTEL, 26, 6, LEAF4_CORE_COUNT, NA, FALSE) \
  332. FIELD( 4, 0, EBX, INTEL, 0, 12, LEAF4_CACHE_LINE, NA, FALSE) \
  333. FIELD( 4, 0, EBX, INTEL, 12, 10, LEAF4_CACHE_PART, NA, FALSE) \
  334. FIELD( 4, 0, EBX, INTEL, 22, 10, LEAF4_CACHE_WAYS, NA, FALSE) \
  335. FIELD( 4, 0, ECX, INTEL, 0, 32, LEAF4_CACHE_SETS, NA, FALSE) \
  336. FLAG( 4, 0, EDX, INTEL, 0, 1, LEAF4_CACHE_WBINVD_NOT_GUARANTEED, NA, FALSE) \
  337. FLAG( 4, 0, EDX, INTEL, 1, 1, LEAF4_CACHE_IS_INCLUSIVE, NA, FALSE) \
  338. FLAG( 4, 0, EDX, INTEL, 2, 1, LEAF4_CACHE_COMPLEX_INDEXING, NA, FALSE)
  339. /* LEVEL, SUB-LEVEL, REG, VENDOR, POS, SIZE, NAME, MON SUPP, CPL3 */
  340. #define CPUID_FIELD_DATA_LEVEL_5 \
  341. FIELD( 5, 0, EAX, COMMON, 0, 16, MWAIT_MIN_SIZE, NA, FALSE) \
  342. FIELD( 5, 0, EBX, COMMON, 0, 16, MWAIT_MAX_SIZE, NA, FALSE) \
  343. FLAG( 5, 0, ECX, COMMON, 0, 1, MWAIT_EXTENSIONS, NA, FALSE) \
  344. FLAG( 5, 0, ECX, COMMON, 1, 1, MWAIT_INTR_BREAK, NA, FALSE) \
  345. FIELD( 5, 0, EDX, INTEL, 0, 4, MWAIT_C0_SUBSTATE, NA, FALSE) \
  346. FIELD( 5, 0, EDX, INTEL, 4, 4, MWAIT_C1_SUBSTATE, NA, FALSE) \
  347. FIELD( 5, 0, EDX, INTEL, 8, 4, MWAIT_C2_SUBSTATE, NA, FALSE) \
  348. FIELD( 5, 0, EDX, INTEL, 12, 4, MWAIT_C3_SUBSTATE, NA, FALSE) \
  349. FIELD( 5, 0, EDX, INTEL, 16, 4, MWAIT_C4_SUBSTATE, NA, FALSE)
  350. /* LEVEL, SUB-LEVEL, REG, VENDOR, POS, SIZE, NAME, MON SUPP, CPL3 */
  351. #define CPUID_FIELD_DATA_LEVEL_6 \
  352. FLAG( 6, 0, EAX, INTEL, 0, 1, THERMAL_SENSOR, NA, FALSE) \
  353. FLAG( 6, 0, EAX, INTEL, 1, 1, TURBO_MODE, NA, FALSE) \
  354. FLAG( 6, 0, EAX, INTEL, 2, 1, APIC_INVARIANT, NA, FALSE) \
  355. FIELD( 6, 0, EBX, INTEL, 0, 4, NUM_INTR_THRESHOLDS, NA, FALSE) \
  356. FLAG( 6, 0, ECX, INTEL, 0, 1, HW_COORD_FEEDBACK, NA, FALSE) \
  357. FLAG( 6, 0, ECX, INTEL, 3, 1, ENERGY_PERF_BIAS, NA, FALSE)
  358. /* LEVEL, SUB-LEVEL, REG, VENDOR, POS, SIZE, NAME, MON SUPP, CPL3 */
  359. #define CPUID_FIELD_DATA_LEVEL_7 \
  360. FLAG( 7, 0, EBX, INTEL, 0, 1, FSGSBASE, YES, FALSE) \
  361. FLAG( 7, 0, EBX, AMD, 3, 1, BMI1, YES, TRUE ) \
  362. FLAG( 7, 0, EBX, INTEL, 4, 1, HLE, YES, TRUE) \
  363. FLAG( 7, 0, EBX, INTEL, 7, 1, SMEP, YES, FALSE) \
  364. FLAG( 7, 0, EBX, INTEL, 9, 1, ENFSTRG, YES, FALSE) \
  365. FLAG( 7, 0, EBX, INTEL, 10, 1, INVPCID, NO, FALSE) \
  366. FLAG( 7, 0, EBX, INTEL, 11, 1, RTM, NO, TRUE)
  367. /* LEVEL, SUB-LEVEL, REG, VENDOR, POS, SIZE, NAME, MON SUPP, CPL3 */
  368. #define CPUID_FIELD_DATA_LEVEL_A \
  369. FIELD( A, 0, EAX, INTEL, 0, 8, PMC_VERSION, NA, FALSE) \
  370. FIELD( A, 0, EAX, INTEL, 8, 8, PMC_NUM_GEN, NA, FALSE) \
  371. FIELD( A, 0, EAX, INTEL, 16, 8, PMC_WIDTH_GEN, NA, FALSE) \
  372. FIELD( A, 0, EAX, INTEL, 24, 8, PMC_EBX_LENGTH, NA, FALSE) \
  373. FLAG( A, 0, EBX, INTEL, 0, 1, PMC_CORE_CYCLES, NA, FALSE) \
  374. FLAG( A, 0, EBX, INTEL, 1, 1, PMC_INSTR_RETIRED, NA, FALSE) \
  375. FLAG( A, 0, EBX, INTEL, 2, 1, PMC_REF_CYCLES, NA, FALSE) \
  376. FLAG( A, 0, EBX, INTEL, 3, 1, PMC_LAST_LVL_CREF, NA, FALSE) \
  377. FLAG( A, 0, EBX, INTEL, 4, 1, PMC_LAST_LVL_CMISS, NA, FALSE) \
  378. FLAG( A, 0, EBX, INTEL, 5, 1, PMC_BR_INST_RETIRED, NA, FALSE) \
  379. FLAG( A, 0, EBX, INTEL, 6, 1, PMC_BR_MISS_RETIRED, NA, FALSE) \
  380. FIELD( A, 0, EDX, INTEL, 0, 5, PMC_NUM_FIXED, NA, FALSE) \
  381. FIELD( A, 0, EDX, INTEL, 5, 8, PMC_WIDTH_FIXED, NA, FALSE)
  382. /* LEVEL, SUB-LEVEL, REG, VENDOR, POS, SIZE, NAME, MON SUPP, CPL3 */
  383. #define CPUID_FIELD_DATA_LEVEL_B \
  384. FIELD( B, 0, EAX, INTEL, 0, 5, TOPOLOGY_MASK_WIDTH, NA, FALSE) \
  385. FIELD( B, 0, EBX, INTEL, 0, 16, TOPOLOGY_CPUS_SHARING_LEVEL, NA, FALSE) \
  386. FIELD( B, 0, ECX, INTEL, 0, 8, TOPOLOGY_LEVEL_NUMBER, NA, FALSE) \
  387. FIELD( B, 0, ECX, INTEL, 8, 8, TOPOLOGY_LEVEL_TYPE, NA, FALSE) \
  388. FIELD( B, 0, EDX, INTEL, 0, 32, TOPOLOGY_X2APIC_ID, NA, FALSE)
  389. /* LEVEL, SUB-LEVEL, REG, VENDOR, POS, SIZE, NAME, MON SUPP, CPL3 */
  390. #define CPUID_FIELD_DATA_LEVEL_D \
  391. FLAG( D, 0, EAX, COMMON, 0, 1, XCR0_MASTER_LEGACY_FP, YES, FALSE) \
  392. FLAG( D, 0, EAX, COMMON, 1, 1, XCR0_MASTER_SSE, YES, FALSE) \
  393. FLAG( D, 0, EAX, COMMON, 2, 1, XCR0_MASTER_YMM_H, YES, FALSE) \
  394. FIELD( D, 0, EAX, COMMON, 3, 29, XCR0_MASTER_LOWER, NO, FALSE) \
  395. FIELD( D, 0, EBX, COMMON, 0, 32, XSAVE_ENABLED_SIZE, ANY, FALSE) \
  396. FIELD( D, 0, ECX, COMMON, 0, 32, XSAVE_MAX_SIZE, YES, FALSE) \
  397. FIELD( D, 0, EDX, COMMON, 0, 29, XCR0_MASTER_UPPER, NO, FALSE) \
  398. FLAG( D, 0, EDX, AMD, 30, 1, XCR0_MASTER_LWP, NO, FALSE) \
  399. FLAG( D, 0, EDX, COMMON, 31, 1, XCR0_MASTER_EXTENDED_XSAVE, NO, FALSE) \
  400. FLAG( D, 1, EAX, COMMON, 0, 1, XSAVEOPT, NO, FALSE) \
  401. FIELD( D, 2, EAX, COMMON, 0, 32, XSAVE_YMM_SIZE, YES, FALSE) \
  402. FIELD( D, 2, EBX, COMMON, 0, 32, XSAVE_YMM_OFFSET, YES, FALSE) \
  403. FIELD( D, 2, ECX, COMMON, 0, 32, XSAVE_YMM_RSVD1, YES, FALSE) \
  404. FIELD( D, 2, EDX, COMMON, 0, 32, XSAVE_YMM_RSVD2, YES, FALSE) \
  405. FIELD( D, 62, EAX, AMD, 0, 32, XSAVE_LWP_SIZE, NO, FALSE) \
  406. FIELD( D, 62, EBX, AMD, 0, 32, XSAVE_LWP_OFFSET, NO, FALSE) \
  407. FIELD( D, 62, ECX, AMD, 0, 32, XSAVE_LWP_RSVD1, NO, FALSE) \
  408. FIELD( D, 62, EDX, AMD, 0, 32, XSAVE_LWP_RSVD2, NO, FALSE)
  409. /* LEVEL, SUB-LEVEL, REG, VENDOR, POS, SIZE, NAME, MON SUPP, CPL3 */
  410. #define CPUID_FIELD_DATA_LEVEL_400 \
  411. FIELD(400, 0, EAX, COMMON, 0, 32, NUM_HYP_LEVELS, NA, FALSE) \
  412. FIELD(400, 0, EBX, COMMON, 0, 32, HYPERVISOR1, NA, FALSE) \
  413. FIELD(400, 0, ECX, COMMON, 0, 32, HYPERVISOR2, NA, FALSE) \
  414. FIELD(400, 0, EDX, COMMON, 0, 32, HYPERVISOR3, NA, FALSE)
  415. /* LEVEL, SUB-LEVEL, REG, VENDOR, POS, SIZE, NAME, MON SUPP, CPL3 */
  416. #define CPUID_FIELD_DATA_LEVEL_410 \
  417. FIELD(410, 0, EAX, COMMON, 0, 32, TSC_HZ, NA, FALSE) \
  418. FIELD(410, 0, EBX, COMMON, 0, 32, ACPIBUS_HZ, NA, FALSE)
  419. /* LEVEL, SUB-LEVEL, REG, VENDOR, POS, SIZE, NAME, MON SUPP, CPL3 */
  420. #define CPUID_FIELD_DATA_LEVEL_80 \
  421. FIELD( 80, 0, EAX, COMMON, 0, 32, NUM_EXT_LEVELS, NA, FALSE) \
  422. FIELD( 80, 0, EBX, AMD, 0, 32, LEAF80_VENDOR1, NA, FALSE) \
  423. FIELD( 80, 0, ECX, AMD, 0, 32, LEAF80_VENDOR3, NA, FALSE) \
  424. FIELD( 80, 0, EDX, AMD, 0, 32, LEAF80_VENDOR2, NA, FALSE)
  425. #define CPUID_81_ECX_17
  426. /* LEVEL, SUB-LEVEL, REG, VENDOR, POS, SIZE, NAME, MON SUPP, CPL3 */
  427. #define CPUID_FIELD_DATA_LEVEL_81 \
  428. FIELD( 81, 0, EAX, INTEL, 0, 32, UNKNOWN81EAX, ANY, FALSE) \
  429. FIELD( 81, 0, EAX, AMD, 0, 4, LEAF81_STEPPING, ANY, FALSE) \
  430. FIELD( 81, 0, EAX, AMD, 4, 4, LEAF81_MODEL, ANY, FALSE) \
  431. FIELD( 81, 0, EAX, AMD, 8, 4, LEAF81_FAMILY, ANY, FALSE) \
  432. FIELD( 81, 0, EAX, AMD, 12, 2, LEAF81_TYPE, ANY, FALSE) \
  433. FIELD( 81, 0, EAX, AMD, 16, 4, LEAF81_EXTENDED_MODEL, ANY, FALSE) \
  434. FIELD( 81, 0, EAX, AMD, 20, 8, LEAF81_EXTENDED_FAMILY, ANY, FALSE) \
  435. FIELD( 81, 0, EBX, INTEL, 0, 32, UNKNOWN81EBX, ANY, FALSE) \
  436. FIELD( 81, 0, EBX, AMD, 0, 16, LEAF81_BRAND_ID, ANY, FALSE) \
  437. FIELD( 81, 0, EBX, AMD, 16, 16, UNDEF, ANY, FALSE) \
  438. FLAG( 81, 0, ECX, COMMON, 0, 1, LAHF64, YES, TRUE) \
  439. FLAG( 81, 0, ECX, AMD, 1, 1, CMPLEGACY, ANY, FALSE) \
  440. FLAG( 81, 0, ECX, AMD, 2, 1, SVM, YES, FALSE) \
  441. FLAG( 81, 0, ECX, AMD, 3, 1, EXTAPICSPC, YES, FALSE) \
  442. FLAG( 81, 0, ECX, AMD, 4, 1, CR8AVAIL, YES, FALSE) \
  443. FLAG( 81, 0, ECX, AMD, 5, 1, ABM, YES, TRUE) \
  444. FLAG( 81, 0, ECX, AMD, 6, 1, SSE4A, YES, TRUE) \
  445. FLAG( 81, 0, ECX, AMD, 7, 1, MISALIGNED_SSE, YES, TRUE) \
  446. FLAG( 81, 0, ECX, AMD, 8, 1, 3DNPREFETCH, YES, TRUE) \
  447. FLAG( 81, 0, ECX, AMD, 9, 1, OSVW, ANY, FALSE) \
  448. FLAG( 81, 0, ECX, AMD, 10, 1, IBS, NO, FALSE) \
  449. FLAG( 81, 0, ECX, AMD, 11, 1, XOP, YES, TRUE) \
  450. FLAG( 81, 0, ECX, AMD, 12, 1, SKINIT, NO, FALSE) \
  451. FLAG( 81, 0, ECX, AMD, 13, 1, WATCHDOG, NO, FALSE) \
  452. FLAG( 81, 0, ECX, AMD, 15, 1, LWP, NO, FALSE) \
  453. FLAG( 81, 0, ECX, AMD, 16, 1, FMA4, YES, TRUE) \
  454. CPUID_81_ECX_17 \
  455. FLAG( 81, 0, ECX, AMD, 19, 1, NODEID_MSR, NO, FALSE) \
  456. FLAG( 81, 0, ECX, AMD, 21, 1, TBM, YES, TRUE) \
  457. FLAG( 81, 0, ECX, AMD, 22, 1, TOPOLOGY, NO, FALSE) \
  458. FLAG( 81, 0, EDX, AMD, 0, 1, LEAF81_FPU, YES, TRUE) \
  459. FLAG( 81, 0, EDX, AMD, 1, 1, LEAF81_VME, YES, FALSE) \
  460. FLAG( 81, 0, EDX, AMD, 2, 1, LEAF81_DE, YES, FALSE) \
  461. FLAG( 81, 0, EDX, AMD, 3, 1, LEAF81_PSE, YES, FALSE) \
  462. FLAG( 81, 0, EDX, AMD, 4, 1, LEAF81_TSC, YES, TRUE) \
  463. FLAG( 81, 0, EDX, AMD, 5, 1, LEAF81_MSR, YES, FALSE) \
  464. FLAG( 81, 0, EDX, AMD, 6, 1, LEAF81_PAE, YES, FALSE) \
  465. FLAG( 81, 0, EDX, AMD, 7, 1, LEAF81_MCE, YES, FALSE) \
  466. FLAG( 81, 0, EDX, AMD, 8, 1, LEAF81_CX8, YES, TRUE) \
  467. FLAG( 81, 0, EDX, AMD, 9, 1, LEAF81_APIC, ANY, FALSE) \
  468. FLAG( 81, 0, EDX, COMMON, 11, 1, SYSC, ANY, TRUE) \
  469. FLAG( 81, 0, EDX, AMD, 12, 1, LEAF81_MTRR, YES, FALSE) \
  470. FLAG( 81, 0, EDX, AMD, 13, 1, LEAF81_PGE, YES, FALSE) \
  471. FLAG( 81, 0, EDX, AMD, 14, 1, LEAF81_MCA, YES, FALSE) \
  472. FLAG( 81, 0, EDX, AMD, 15, 1, LEAF81_CMOV, YES, TRUE) \
  473. FLAG( 81, 0, EDX, AMD, 16, 1, LEAF81_PAT, YES, FALSE) \
  474. FLAG( 81, 0, EDX, AMD, 17, 1, LEAF81_PSE36, YES, FALSE) \
  475. FLAG( 81, 0, EDX, COMMON, 20, 1, NX, YES, FALSE) \
  476. FLAG( 81, 0, EDX, AMD, 22, 1, MMXEXT, YES, TRUE) \
  477. FLAG( 81, 0, EDX, AMD, 23, 1, LEAF81_MMX, YES, TRUE) \
  478. FLAG( 81, 0, EDX, AMD, 24, 1, LEAF81_FXSR, YES, TRUE) \
  479. FLAG( 81, 0, EDX, AMD, 25, 1, FFXSR, YES, FALSE) \
  480. FLAG( 81, 0, EDX, COMMON, 26, 1, PDPE1GB, YES, FALSE) \
  481. FLAG( 81, 0, EDX, COMMON, 27, 1, RDTSCP, YES, TRUE) \
  482. FLAG( 81, 0, EDX, COMMON, 29, 1, LM, YES, FALSE) \
  483. FLAG( 81, 0, EDX, AMD, 30, 1, 3DNOWPLUS, YES, TRUE) \
  484. FLAG( 81, 0, EDX, AMD, 31, 1, 3DNOW, YES, TRUE)
  485. #define CPUID_8A_EDX_11 \
  486. FLAG( 8A, 0, EDX, AMD, 11, 1, SVMEDX_RSVD1, NO, FALSE)
  487. #define CPUID_8A_EDX_13_31 \
  488. FIELD( 8A, 0, EDX, AMD, 13, 19, SVMEDX_RSVD2, NO, FALSE)
  489. /* LEVEL, REG, VENDOR, POS, SIZE, NAME, MON SUPP, CPL3 */
  490. #define CPUID_FIELD_DATA_LEVEL_8x \
  491. FIELD( 85, 0, EAX, AMD, 0, 8, ITLB_ENTRIES_2M4M_PGS, NA, FALSE) \
  492. FIELD( 85, 0, EAX, AMD, 8, 8, ITLB_ASSOC_2M4M_PGS, NA, FALSE) \
  493. FIELD( 85, 0, EAX, AMD, 16, 8, DTLB_ENTRIES_2M4M_PGS, NA, FALSE) \
  494. FIELD( 85, 0, EAX, AMD, 24, 8, DTLB_ASSOC_2M4M_PGS, NA, FALSE) \
  495. FIELD( 85, 0, EBX, AMD, 0, 8, ITLB_ENTRIES_4K_PGS, NA, FALSE) \
  496. FIELD( 85, 0, EBX, AMD, 8, 8, ITLB_ASSOC_4K_PGS, NA, FALSE) \
  497. FIELD( 85, 0, EBX, AMD, 16, 8, DTLB_ENTRIES_4K_PGS, NA, FALSE) \
  498. FIELD( 85, 0, EBX, AMD, 24, 8, DTLB_ASSOC_4K_PGS, NA, FALSE) \
  499. FIELD( 85, 0, ECX, AMD, 0, 8, L1_DCACHE_LINE_SIZE, NA, FALSE) \
  500. FIELD( 85, 0, ECX, AMD, 8, 8, L1_DCACHE_LINES_PER_TAG, NA, FALSE) \
  501. FIELD( 85, 0, ECX, AMD, 16, 8, L1_DCACHE_ASSOC, NA, FALSE) \
  502. FIELD( 85, 0, ECX, AMD, 24, 8, L1_DCACHE_SIZE, NA, FALSE) \
  503. FIELD( 85, 0, EDX, AMD, 0, 8, L1_ICACHE_LINE_SIZE, NA, FALSE) \
  504. FIELD( 85, 0, EDX, AMD, 8, 8, L1_ICACHE_LINES_PER_TAG, NA, FALSE) \
  505. FIELD( 85, 0, EDX, AMD, 16, 8, L1_ICACHE_ASSOC, NA, FALSE) \
  506. FIELD( 85, 0, EDX, AMD, 24, 8, L1_ICACHE_SIZE, NA, FALSE) \
  507. FIELD( 86, 0, EAX, AMD, 0, 12, L2_ITLB_ENTRIES_2M4M_PGS, NA, FALSE) \
  508. FIELD( 86, 0, EAX, AMD, 12, 4, L2_ITLB_ASSOC_2M4M_PGS, NA, FALSE) \
  509. FIELD( 86, 0, EAX, AMD, 16, 12, L2_DTLB_ENTRIES_2M4M_PGS, NA, FALSE) \
  510. FIELD( 86, 0, EAX, AMD, 28, 4, L2_DTLB_ASSOC_2M4M_PGS, NA, FALSE) \
  511. FIELD( 86, 0, EBX, AMD, 0, 12, L2_ITLB_ENTRIES_4K_PGS, NA, FALSE) \
  512. FIELD( 86, 0, EBX, AMD, 12, 4, L2_ITLB_ASSOC_4K_PGS, NA, FALSE) \
  513. FIELD( 86, 0, EBX, AMD, 16, 12, L2_DTLB_ENTRIES_4K_PGS, NA, FALSE) \
  514. FIELD( 86, 0, EBX, AMD, 28, 4, L2_DTLB_ASSOC_4K_PGS, NA, FALSE) \
  515. FIELD( 86, 0, ECX, AMD, 0, 8, L2CACHE_LINE, NA, FALSE) \
  516. FIELD( 86, 0, ECX, AMD, 8, 4, L2CACHE_LINE_PER_TAG, NA, FALSE) \
  517. FIELD( 86, 0, ECX, AMD, 12, 4, L2CACHE_WAYS, NA, FALSE) \
  518. FIELD( 86, 0, ECX, AMD, 16, 16, L2CACHE_SIZE, NA, FALSE) \
  519. FIELD( 86, 0, EDX, AMD, 0, 8, L3CACHE_LINE, NA, FALSE) \
  520. FIELD( 86, 0, EDX, AMD, 8, 4, L3CACHE_LINE_PER_TAG, NA, FALSE) \
  521. FIELD( 86, 0, EDX, AMD, 12, 4, L3CACHE_WAYS, NA, FALSE) \
  522. FIELD( 86, 0, EDX, AMD, 18, 14, L3CACHE_SIZE, NA, FALSE) \
  523. FLAG( 87, 0, EDX, AMD, 0, 1, TS, NA, FALSE) \
  524. FLAG( 87, 0, EDX, AMD, 1, 1, FID, NA, FALSE) \
  525. FLAG( 87, 0, EDX, AMD, 2, 1, VID, NA, FALSE) \
  526. FLAG( 87, 0, EDX, AMD, 3, 1, TTP, NA, FALSE) \
  527. FLAG( 87, 0, EDX, AMD, 4, 1, LEAF87_TM, NA, FALSE) \
  528. FLAG( 87, 0, EDX, AMD, 5, 1, STC, NA, FALSE) \
  529. FLAG( 87, 0, EDX, AMD, 6, 1, 100MHZSTEPS, NA, FALSE) \
  530. FLAG( 87, 0, EDX, AMD, 7, 1, HWPSTATE, NA, FALSE) \
  531. FLAG( 87, 0, EDX, COMMON, 8, 1, TSC_INVARIANT, NA, FALSE) \
  532. FLAG( 87, 0, EDX, COMMON, 9, 1, CORE_PERF_BOOST, NA, FALSE) \
  533. FIELD( 88, 0, EAX, COMMON, 0, 8, PHYS_BITS, NA, FALSE) \
  534. FIELD( 88, 0, EAX, COMMON, 8, 8, VIRT_BITS, NA, FALSE) \
  535. FIELD( 88, 0, EAX, COMMON, 16, 8, GUEST_PHYS_ADDR_SZ, NA, FALSE) \
  536. FIELD( 88, 0, ECX, AMD, 0, 8, LEAF88_CORE_COUNT, NA, FALSE) \
  537. FIELD( 88, 0, ECX, AMD, 12, 4, APICID_COREID_SIZE, NA, FALSE) \
  538. FIELD( 8A, 0, EAX, AMD, 0, 8, SVM_REVISION, YES, FALSE) \
  539. FLAG( 8A, 0, EAX, AMD, 8, 1, SVM_HYPERVISOR, NO, FALSE) \
  540. FIELD( 8A, 0, EAX, AMD, 9, 23, SVMEAX_RSVD, NO, FALSE) \
  541. FIELD( 8A, 0, EBX, AMD, 0, 32, SVM_NUM_ASIDS, YES, FALSE) \
  542. FIELD( 8A, 0, ECX, AMD, 0, 32, SVMECX_RSVD, NO, FALSE) \
  543. FLAG( 8A, 0, EDX, AMD, 0, 1, SVM_NPT, YES, FALSE) \
  544. FLAG( 8A, 0, EDX, AMD, 1, 1, SVM_LBR, NO, FALSE) \
  545. FLAG( 8A, 0, EDX, AMD, 2, 1, SVM_LOCK, ANY, FALSE) \
  546. FLAG( 8A, 0, EDX, AMD, 3, 1, SVM_NRIP, YES, FALSE) \
  547. FLAG( 8A, 0, EDX, AMD, 4, 1, SVM_TSC_RATE_MSR, NO, FALSE) \
  548. FLAG( 8A, 0, EDX, AMD, 5, 1, SVM_VMCB_CLEAN, YES, FALSE) \
  549. FLAG( 8A, 0, EDX, AMD, 6, 1, SVM_FLUSH_BY_ASID, YES, FALSE) \
  550. FLAG( 8A, 0, EDX, AMD, 7, 1, SVM_DECODE_ASSISTS, YES, FALSE) \
  551. FIELD( 8A, 0, EDX, AMD, 8, 2, SVMEDX_RSVD0, NO, FALSE) \
  552. FLAG( 8A, 0, EDX, AMD, 10, 1, SVM_PAUSE_FILTER, NO, FALSE) \
  553. CPUID_8A_EDX_11 \
  554. FLAG( 8A, 0, EDX, AMD, 12, 1, SVM_PAUSE_THRESHOLD, NO, FALSE) \
  555. CPUID_8A_EDX_13_31
  556. /* LEVEL, SUB-LEVEL, REG, VENDOR, POS, SIZE, NAME, MON SUPP, CPL3 */
  557. #define CPUID_FIELD_DATA_LEVEL_81x \
  558. FIELD(819, 0, EAX, AMD, 0, 12, L1_ITLB_ENTRIES_1G_PGS, NA, FALSE) \
  559. FIELD(819, 0, EAX, AMD, 12, 4, L1_ITLB_ASSOC_1G_PGS, NA, FALSE) \
  560. FIELD(819, 0, EAX, AMD, 16, 12, L1_DTLB_ENTRIES_1G_PGS, NA, FALSE) \
  561. FIELD(819, 0, EAX, AMD, 28, 4, L1_DTLB_ASSOC_1G_PGS, NA, FALSE) \
  562. FIELD(819, 0, EBX, AMD, 0, 12, L2_ITLB_ENTRIES_1G_PGS, NA, FALSE) \
  563. FIELD(819, 0, EBX, AMD, 12, 4, L2_ITLB_ASSOC_1G_PGS, NA, FALSE) \
  564. FIELD(819, 0, EBX, AMD, 16, 12, L2_DTLB_ENTRIES_1G_PGS, NA, FALSE) \
  565. FIELD(819, 0, EBX, AMD, 28, 4, L2_DTLB_ASSOC_1G_PGS, NA, FALSE) \
  566. FLAG( 81A, 0, EAX, AMD, 0, 1, FP128, NA, FALSE) \
  567. FLAG( 81A, 0, EAX, AMD, 1, 1, MOVU, NA, FALSE) \
  568. FLAG( 81B, 0, EAX, AMD, 0, 1, IBS_FFV, NA, FALSE) \
  569. FLAG( 81B, 0, EAX, AMD, 1, 1, IBS_FETCHSAM, NA, FALSE) \
  570. FLAG( 81B, 0, EAX, AMD, 2, 1, IBS_OPSAM, NA, FALSE) \
  571. FLAG( 81B, 0, EAX, AMD, 3, 1, RW_OPCOUNT, NA, FALSE) \
  572. FLAG( 81B, 0, EAX, AMD, 4, 1, OPCOUNT, NA, FALSE) \
  573. FLAG( 81B, 0, EAX, AMD, 5, 1, BRANCH_TARGET_ADDR, NA, FALSE) \
  574. FLAG( 81B, 0, EAX, AMD, 6, 1, OPCOUNT_EXT, NA, FALSE) \
  575. FLAG( 81B, 0, EAX, AMD, 7, 1, RIP_INVALID_CHECK, NA, FALSE) \
  576. FLAG( 81C, 0, EAX, AMD, 0, 1, LWP_AVAIL, NA, FALSE) \
  577. FLAG( 81C, 0, EAX, AMD, 1, 1, LWP_VAL_AVAIL, NA, FALSE) \
  578. FLAG( 81C, 0, EAX, AMD, 2, 1, LWP_IRE_AVAIL, NA, FALSE) \
  579. FLAG( 81C, 0, EAX, AMD, 3, 1, LWP_BRE_AVAIL, NA, FALSE) \
  580. FLAG( 81C, 0, EAX, AMD, 4, 1, LWP_DME_AVAIL, NA, FALSE) \
  581. FLAG( 81C, 0, EAX, AMD, 5, 1, LWP_CNH_AVAIL, NA, FALSE) \
  582. FLAG( 81C, 0, EAX, AMD, 6, 1, LWP_RNH_AVAIL, NA, FALSE) \
  583. FLAG( 81C, 0, EAX, AMD, 31, 1, LWP_INT_AVAIL, NA, FALSE) \
  584. FIELD(81C, 0, EBX, AMD, 0, 8, LWP_CB_SIZE, NA, FALSE) \
  585. FIELD(81C, 0, EBX, AMD, 8, 8, LWP_EVENT_SIZE, NA, FALSE) \
  586. FIELD(81C, 0, EBX, AMD, 16, 8, LWP_MAX_EVENTS, NA, FALSE) \
  587. FIELD(81C, 0, EBX, AMD, 24, 8, LWP_EVENT_OFFSET, NA, FALSE) \
  588. FIELD(81C, 0, ECX, AMD, 0, 4, LWP_LATENCY_MAX, NA, FALSE) \
  589. FLAG( 81C, 0, ECX, AMD, 5, 1, LWP_DATA_ADDR_VALID, NA, FALSE) \
  590. FIELD(81C, 0, ECX, AMD, 6, 3, LWP_LATENCY_ROUND, NA, FALSE) \
  591. FIELD(81C, 0, ECX, AMD, 9, 7, LWP_VERSION, NA, FALSE) \
  592. FIELD(81C, 0, ECX, AMD, 16, 8, LWP_MIN_BUF_SIZE, NA, FALSE) \
  593. FLAG( 81C, 0, ECX, AMD, 28, 1, LWP_BRANCH_PRED, NA, FALSE) \
  594. FLAG( 81C, 0, ECX, AMD, 29, 1, LWP_IP_FILTERING, NA, FALSE) \
  595. FLAG( 81C, 0, ECX, AMD, 30, 1, LWP_CACHE_LEVEL, NA, FALSE) \
  596. FLAG( 81C, 0, ECX, AMD, 31, 1, LWP_CACHE_LATENCY, NA, FALSE) \
  597. FLAG( 81C, 0, EDX, AMD, 0, 1, LWP_SUPPORTED, NA, FALSE) \
  598. FLAG( 81C, 0, EDX, AMD, 1, 1, LWP_VAL_SUPPORTED, NA, FALSE) \
  599. FLAG( 81C, 0, EDX, AMD, 2, 1, LWP_IRE_SUPPORTED, NA, FALSE) \
  600. FLAG( 81C, 0, EDX, AMD, 3, 1, LWP_BRE_SUPPORTED, NA, FALSE) \
  601. FLAG( 81C, 0, EDX, AMD, 4, 1, LWP_DME_SUPPORTED, NA, FALSE) \
  602. FLAG( 81C, 0, EDX, AMD, 5, 1, LWP_CNH_SUPPORTED, NA, FALSE) \
  603. FLAG( 81C, 0, EDX, AMD, 6, 1, LWP_RNH_SUPPORTED, NA, FALSE) \
  604. FLAG( 81C, 0, EDX, AMD, 31, 1, LWP_INT_SUPPORTED, NA, FALSE) \
  605. FIELD(81D, 0, EAX, AMD, 0, 5, LEAF81D_CACHE_TYPE, NA, FALSE) \
  606. FIELD(81D, 0, EAX, AMD, 5, 3, LEAF81D_CACHE_LEVEL, NA, FALSE) \
  607. FLAG( 81D, 0, EAX, AMD, 8, 1, LEAF81D_CACHE_SELF_INIT, NA, FALSE) \
  608. FLAG( 81D, 0, EAX, AMD, 9, 1, LEAF81D_CACHE_FULLY_ASSOC, NA, FALSE) \
  609. FIELD(81D, 0, EAX, AMD, 14, 12, LEAF81D_NUM_SHARING_CACHE, NA, FALSE) \
  610. FIELD(81D, 0, EBX, AMD, 0, 12, LEAF81D_CACHE_LINE_SIZE, NA, FALSE) \
  611. FIELD(81D, 0, EBX, AMD, 12, 10, LEAF81D_CACHE_PHYS_PARTITIONS, NA, FALSE) \
  612. FIELD(81D, 0, EBX, AMD, 22, 10, LEAF81D_CACHE_WAYS, NA, FALSE) \
  613. FIELD(81D, 0, ECX, AMD, 0, 32, LEAF81D_CACHE_NUM_SETS, NA, FALSE) \
  614. FLAG( 81D, 0, EDX, AMD, 0, 1, LEAF81D_CACHE_WBINVD, NA, FALSE) \
  615. FLAG( 81D, 0, EDX, AMD, 1, 1, LEAF81D_CACHE_INCLUSIVE, NA, FALSE) \
  616. FIELD(81E, 0, EAX, AMD, 0, 32, EXTENDED_APICID, NA, FALSE) \
  617. FIELD(81E, 0, EBX, AMD, 0, 8, COMPUTE_UNIT_ID, NA, FALSE) \
  618. FIELD(81E, 0, EBX, AMD, 8, 2, CORES_PER_COMPUTE_UNIT, NA, FALSE) \
  619. FIELD(81E, 0, ECX, AMD, 0, 8, NODEID_VAL, NA, FALSE) \
  620. FIELD(81E, 0, ECX, AMD, 8, 3, NODES_PER_PKG, NA, FALSE)
  621. #define INTEL_CPUID_FIELD_DATA
  622. #define AMD_CPUID_FIELD_DATA
  623. #define CPUID_FIELD_DATA \
  624. CPUID_FIELD_DATA_LEVEL_0 \
  625. CPUID_FIELD_DATA_LEVEL_1 \
  626. CPUID_FIELD_DATA_LEVEL_4 \
  627. CPUID_FIELD_DATA_LEVEL_5 \
  628. CPUID_FIELD_DATA_LEVEL_6 \
  629. CPUID_FIELD_DATA_LEVEL_7 \
  630. CPUID_FIELD_DATA_LEVEL_A \
  631. CPUID_FIELD_DATA_LEVEL_B \
  632. CPUID_FIELD_DATA_LEVEL_D \
  633. CPUID_FIELD_DATA_LEVEL_400 \
  634. CPUID_FIELD_DATA_LEVEL_410 \
  635. CPUID_FIELD_DATA_LEVEL_80 \
  636. CPUID_FIELD_DATA_LEVEL_81 \
  637. CPUID_FIELD_DATA_LEVEL_8x \
  638. CPUID_FIELD_DATA_LEVEL_81x \
  639. INTEL_CPUID_FIELD_DATA \
  640. AMD_CPUID_FIELD_DATA
  641. /*
  642. * Define all field and flag values as an enum. The result is a full
  643. * set of values taken from the table above in the form:
  644. *
  645. * CPUID_FEATURE_<vendor>_ID<level><reg>_<name> == mask for feature
  646. * CPUID_<vendor>_ID<level><reg>_<name>_MASK == mask for field
  647. * CPUID_<vendor>_ID<level><reg>_<name>_SHIFT == offset of field
  648. *
  649. * e.g. - CPUID_FEATURE_COMMON_ID1EDX_FPU = 0x1
  650. * - CPUID_COMMON_ID88EAX_VIRT_BITS_MASK = 0xff00
  651. * - CPUID_COMMON_ID88EAX_VIRT_BITS_SHIFT = 8
  652. *
  653. * Note: The FEATURE/MASK definitions must use some gymnastics to get
  654. * around a warning when shifting left by 32.
  655. */
  656. #define VMW_BIT_MASK(shift) (((1 << (shift - 1)) << 1) - 1)
  657. #define FIELD(lvl, ecxIn, reg, vend, bitpos, size, name, s, c3) \
  658. CPUID_##vend##_ID##lvl##reg##_##name##_SHIFT = bitpos, \
  659. CPUID_##vend##_ID##lvl##reg##_##name##_MASK = \
  660. VMW_BIT_MASK(size) << bitpos, \
  661. CPUID_FEATURE_##vend##_ID##lvl##reg##_##name = \
  662. CPUID_##vend##_ID##lvl##reg##_##name##_MASK, \
  663. CPUID_INTERNAL_SHIFT_##name = bitpos, \
  664. CPUID_INTERNAL_MASK_##name = VMW_BIT_MASK(size) << bitpos, \
  665. CPUID_INTERNAL_REG_##name = CPUID_REG_##reg, \
  666. CPUID_INTERNAL_EAXIN_##name = CPUID_LEVEL_VAL_##lvl, \
  667. CPUID_INTERNAL_ECXIN_##name = ecxIn,
  668. #define FLAG FIELD
  669. enum {
  670. /* Define data for every CPUID field we have */
  671. CPUID_FIELD_DATA
  672. };
  673. #undef VMW_BIT_MASK
  674. #undef FIELD
  675. #undef FLAG
  676. /* Level D subleaf 1 eax XSAVEOPT */
  677. #define CPUID_COMMON_IDDsub1EAX_XSAVEOPT 1
  678. /*
  679. * Legal CPUID config file mask characters. For a description of the
  680. * cpuid masking system, please see:
  681. *
  682. * http://vmweb.vmware.com/~mts/cgi-bin/view.cgi/Apps/CpuMigrationChecks
  683. */
  684. #define CPUID_MASK_HIDE_CHR '0'
  685. #define CPUID_MASK_HIDE_STR "0"
  686. #define CPUID_MASK_FORCE_CHR '1'
  687. #define CPUID_MASK_FORCE_STR "1"
  688. #define CPUID_MASK_PASS_CHR '-'
  689. #define CPUID_MASK_PASS_STR "-"
  690. #define CPUID_MASK_TRUE_CHR 'T'
  691. #define CPUID_MASK_TRUE_STR "T"
  692. #define CPUID_MASK_FALSE_CHR 'F'
  693. #define CPUID_MASK_FALSE_STR "F"
  694. #define CPUID_MASK_IGNORE_CHR 'X'
  695. #define CPUID_MASK_IGNORE_STR "X"
  696. #define CPUID_MASK_HOST_CHR 'H'
  697. #define CPUID_MASK_HOST_STR "H"
  698. #define CPUID_MASK_RSVD_CHR 'R'
  699. #define CPUID_MASK_RSVD_STR "R"
  700. #define CPUID_MASK_INSTALL_CHR 'I'
  701. #define CPUID_MASK_INSTALL_STR "I"
  702. /*
  703. * When LM is disabled, we overlay the following masks onto the
  704. * guest's default masks. Any level that is not defined below should
  705. * be treated as all "-"s
  706. */
  707. #define CPT_ID1ECX_LM_DISABLED "----:----:----:----:--0-:----:----:----"
  708. #define CPT_ID81EDX_LM_DISABLED "--0-:----:----:----:----:----:----:----"
  709. #define CPT_ID81ECX_LM_DISABLED "----:----:----:----:----:----:----:---0"
  710. #define CPT_GET_LM_DISABLED_MASK(lvl, reg) \
  711. ((lvl == 1 && reg == CPUID_REG_ECX) ? CPT_ID1ECX_LM_DISABLED : \
  712. (lvl == 0x80000001 && reg == CPUID_REG_ECX) ? CPT_ID81ECX_LM_DISABLED : \
  713. (lvl == 0x80000001 && reg == CPUID_REG_EDX) ? CPT_ID81EDX_LM_DISABLED : \
  714. NULL)
  715. /*
  716. * CPUID_MASK --
  717. * CPUID_SHIFT --
  718. * CPUID_ISSET --
  719. * CPUID_GET --
  720. * CPUID_SET --
  721. * CPUID_CLEAR --
  722. * CPUID_SETTO --
  723. *
  724. * Accessor macros for all CPUID consts/fields/flags. Level and reg are not
  725. * required, but are used to force compile-time asserts which help verify that
  726. * the flag is being used on the right CPUID input and result register.
  727. *
  728. * Note: ASSERT_ON_COMPILE is duplicated rather than factored into its own
  729. * macro, because token concatenation does not work as expected if an input is
  730. * #defined (e.g. APIC) when macros are nested. Also, compound statements
  731. * within parenthes is a GCC extension, so we must use runtime asserts with
  732. * other compilers.
  733. */
  734. #if defined(__GNUC__) && !defined(__clang__)
  735. #define CPUID_MASK(eaxIn, reg, flag) \
  736. ({ \
  737. ASSERT_ON_COMPILE(eaxIn == CPUID_INTERNAL_EAXIN_##flag && \
  738. CPUID_REG_##reg == (CpuidReg)CPUID_INTERNAL_REG_##flag); \
  739. CPUID_INTERNAL_MASK_##flag; \
  740. })
  741. #define CPUID_SHIFT(eaxIn, reg, flag) \
  742. ({ \
  743. ASSERT_ON_COMPILE(eaxIn == CPUID_INTERNAL_EAXIN_##flag && \
  744. CPUID_REG_##reg == (CpuidReg)CPUID_INTERNAL_REG_##flag); \
  745. CPUID_INTERNAL_SHIFT_##flag; \
  746. })
  747. #define CPUID_ISSET(eaxIn, reg, flag, data) \
  748. ({ \
  749. ASSERT_ON_COMPILE(eaxIn == CPUID_INTERNAL_EAXIN_##flag && \
  750. CPUID_REG_##reg == (CpuidReg)CPUID_INTERNAL_REG_##flag); \
  751. (((data) & CPUID_INTERNAL_MASK_##flag) != 0); \
  752. })
  753. #define CPUID_GET(eaxIn, reg, field, data) \
  754. ({ \
  755. ASSERT_ON_COMPILE(eaxIn == CPUID_INTERNAL_EAXIN_##field && \
  756. CPUID_REG_##reg == (CpuidReg)CPUID_INTERNAL_REG_##field); \
  757. (((uint32)(data) & CPUID_INTERNAL_MASK_##field) >> \
  758. CPUID_INTERNAL_SHIFT_##field); \
  759. })
  760. #else
  761. /*
  762. * CPUIDCheck --
  763. *
  764. * Return val after verifying parameters.
  765. */
  766. static INLINE uint32
  767. CPUIDCheck(uint32 eaxIn, uint32 eaxInCheck,
  768. CpuidReg reg, CpuidReg regCheck, uint32 val)
  769. {
  770. ASSERT(eaxIn == eaxInCheck && reg == regCheck);
  771. return val;
  772. }
  773. #define CPUID_MASK(eaxIn, reg, flag) \
  774. CPUIDCheck((uint32)eaxIn, CPUID_INTERNAL_EAXIN_##flag, \
  775. CPUID_REG_##reg, (CpuidReg)CPUID_INTERNAL_REG_##flag, \
  776. CPUID_INTERNAL_MASK_##flag)
  777. #define CPUID_SHIFT(eaxIn, reg, flag) \
  778. CPUIDCheck((uint32)eaxIn, CPUID_INTERNAL_EAXIN_##flag, \
  779. CPUID_REG_##reg, (CpuidReg)CPUID_INTERNAL_REG_##flag, \
  780. CPUID_INTERNAL_SHIFT_##flag)
  781. #define CPUID_ISSET(eaxIn, reg, flag, data) \
  782. (CPUIDCheck((uint32)eaxIn, CPUID_INTERNAL_EAXIN_##flag, \
  783. CPUID_REG_##reg, (CpuidReg)CPUID_INTERNAL_REG_##flag, \
  784. CPUID_INTERNAL_MASK_##flag & (data)) != 0)
  785. #define CPUID_GET(eaxIn, reg, field, data) \
  786. CPUIDCheck((uint32)eaxIn, CPUID_INTERNAL_EAXIN_##field, \
  787. CPUID_REG_##reg, (CpuidReg)CPUID_INTERNAL_REG_##field, \
  788. ((uint32)(data) & CPUID_INTERNAL_MASK_##field) >> \
  789. CPUID_INTERNAL_SHIFT_##field)
  790. #endif
  791. #define CPUID_SET(eaxIn, reg, flag, dataPtr) \
  792. do { \
  793. ASSERT_ON_COMPILE( \
  794. (uint32)eaxIn == (uint32)CPUID_INTERNAL_EAXIN_##flag && \
  795. CPUID_REG_##reg == (CpuidReg)CPUID_INTERNAL_REG_##flag); \
  796. *(dataPtr) |= CPUID_INTERNAL_MASK_##flag; \
  797. } while (0)
  798. #define CPUID_CLEAR(eaxIn, reg, flag, dataPtr) \
  799. do { \
  800. ASSERT_ON_COMPILE( \
  801. (uint32)eaxIn == (uint32)CPUID_INTERNAL_EAXIN_##flag && \
  802. CPUID_REG_##reg == (CpuidReg)CPUID_INTERNAL_REG_##flag); \
  803. *(dataPtr) &= ~CPUID_INTERNAL_MASK_##flag; \
  804. } while (0)
  805. #define CPUID_SETTO(eaxIn, reg, field, dataPtr, val) \
  806. do { \
  807. uint32 _v = val; \
  808. uint32 *_d = dataPtr; \
  809. ASSERT_ON_COMPILE( \
  810. (uint32)eaxIn == (uint32)CPUID_INTERNAL_EAXIN_##field && \
  811. CPUID_REG_##reg == (CpuidReg)CPUID_INTERNAL_REG_##field); \
  812. *_d = (*_d & ~CPUID_INTERNAL_MASK_##field) | \
  813. (_v << CPUID_INTERNAL_SHIFT_##field); \
  814. ASSERT(_v == (*_d & CPUID_INTERNAL_MASK_##field) >> \
  815. CPUID_INTERNAL_SHIFT_##field); \
  816. } while (0)
  817. #define CPUID_SETTO_SAFE(eaxIn, reg, field, dataPtr, val) \
  818. do { \
  819. uint32 _v = val &

Large files files are truncated, but you can click here to view the full file