cpuid.h 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. /*
  2. * Copyright (C) 2007-2019 Free Software Foundation, Inc.
  3. *
  4. * This file is free software; you can redistribute it and/or modify it
  5. * under the terms of the GNU General Public License as published by the
  6. * Free Software Foundation; either version 3, or (at your option) any
  7. * later version.
  8. *
  9. * This file is distributed in the hope that it will be useful, but
  10. * WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. * General Public License for more details.
  13. *
  14. * Under Section 7 of GPL version 3, you are granted additional
  15. * permissions described in the GCC Runtime Library Exception, version
  16. * 3.1, as published by the Free Software Foundation.
  17. *
  18. * You should have received a copy of the GNU General Public License and
  19. * a copy of the GCC Runtime Library Exception along with this program;
  20. * see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
  21. * <http://www.gnu.org/licenses/>.
  22. */
  23. /* %ecx */
  24. #define bit_SSE3 (1 << 0)
  25. #define bit_PCLMUL (1 << 1)
  26. #define bit_LZCNT (1 << 5)
  27. #define bit_SSSE3 (1 << 9)
  28. #define bit_FMA (1 << 12)
  29. #define bit_CMPXCHG16B (1 << 13)
  30. #define bit_SSE4_1 (1 << 19)
  31. #define bit_SSE4_2 (1 << 20)
  32. #define bit_MOVBE (1 << 22)
  33. #define bit_POPCNT (1 << 23)
  34. #define bit_AES (1 << 25)
  35. #define bit_XSAVE (1 << 26)
  36. #define bit_OSXSAVE (1 << 27)
  37. #define bit_AVX (1 << 28)
  38. #define bit_F16C (1 << 29)
  39. #define bit_RDRND (1 << 30)
  40. /* %edx */
  41. #define bit_CMPXCHG8B (1 << 8)
  42. #define bit_CMOV (1 << 15)
  43. #define bit_MMX (1 << 23)
  44. #define bit_FXSAVE (1 << 24)
  45. #define bit_SSE (1 << 25)
  46. #define bit_SSE2 (1 << 26)
  47. /* Extended Features (%eax == 0x80000001) */
  48. /* %ecx */
  49. #define bit_LAHF_LM (1 << 0)
  50. #define bit_ABM (1 << 5)
  51. #define bit_SSE4a (1 << 6)
  52. #define bit_PRFCHW (1 << 8)
  53. #define bit_XOP (1 << 11)
  54. #define bit_LWP (1 << 15)
  55. #define bit_FMA4 (1 << 16)
  56. #define bit_TBM (1 << 21)
  57. #define bit_MWAITX (1 << 29)
  58. /* %edx */
  59. #define bit_MMXEXT (1 << 22)
  60. #define bit_LM (1 << 29)
  61. #define bit_3DNOWP (1 << 30)
  62. #define bit_3DNOW (1u << 31)
  63. /* %ebx */
  64. #define bit_CLZERO (1 << 0)
  65. #define bit_WBNOINVD (1 << 9)
  66. /* Extended Features (%eax == 7) */
  67. /* %ebx */
  68. #define bit_FSGSBASE (1 << 0)
  69. #define bit_SGX (1 << 2)
  70. #define bit_BMI (1 << 3)
  71. #define bit_HLE (1 << 4)
  72. #define bit_AVX2 (1 << 5)
  73. #define bit_BMI2 (1 << 8)
  74. #define bit_RTM (1 << 11)
  75. #define bit_MPX (1 << 14)
  76. #define bit_AVX512F (1 << 16)
  77. #define bit_AVX512DQ (1 << 17)
  78. #define bit_RDSEED (1 << 18)
  79. #define bit_ADX (1 << 19)
  80. #define bit_AVX512IFMA (1 << 21)
  81. #define bit_CLFLUSHOPT (1 << 23)
  82. #define bit_CLWB (1 << 24)
  83. #define bit_AVX512PF (1 << 26)
  84. #define bit_AVX512ER (1 << 27)
  85. #define bit_AVX512CD (1 << 28)
  86. #define bit_SHA (1 << 29)
  87. #define bit_AVX512BW (1 << 30)
  88. #define bit_AVX512VL (1u << 31)
  89. /* %ecx */
  90. #define bit_PREFETCHWT1 (1 << 0)
  91. #define bit_AVX512VBMI (1 << 1)
  92. #define bit_PKU (1 << 3)
  93. #define bit_OSPKE (1 << 4)
  94. #define bit_WAITPKG (1 << 5)
  95. #define bit_AVX512VBMI2 (1 << 6)
  96. #define bit_SHSTK (1 << 7)
  97. #define bit_GFNI (1 << 8)
  98. #define bit_VAES (1 << 9)
  99. #define bit_AVX512VNNI (1 << 11)
  100. #define bit_VPCLMULQDQ (1 << 10)
  101. #define bit_AVX512BITALG (1 << 12)
  102. #define bit_AVX512VPOPCNTDQ (1 << 14)
  103. #define bit_RDPID (1 << 22)
  104. #define bit_MOVDIRI (1 << 27)
  105. #define bit_MOVDIR64B (1 << 28)
  106. #define bit_CLDEMOTE (1 << 25)
  107. /* %edx */
  108. #define bit_AVX5124VNNIW (1 << 2)
  109. #define bit_AVX5124FMAPS (1 << 3)
  110. #define bit_IBT (1 << 20)
  111. #define bit_PCONFIG (1 << 18)
  112. /* XFEATURE_ENABLED_MASK register bits (%eax == 13, %ecx == 0) */
  113. #define bit_BNDREGS (1 << 3)
  114. #define bit_BNDCSR (1 << 4)
  115. /* Extended State Enumeration Sub-leaf (%eax == 13, %ecx == 1) */
  116. #define bit_XSAVEOPT (1 << 0)
  117. #define bit_XSAVEC (1 << 1)
  118. #define bit_XSAVES (1 << 3)
  119. /* PT sub leaf (%eax == 14, %ecx == 0) */
  120. /* %ebx */
  121. #define bit_PTWRITE (1 << 4)
  122. /* Signatures for different CPU implementations as returned in uses
  123. of cpuid with level 0. */
  124. #define signature_AMD_ebx 0x68747541
  125. #define signature_AMD_ecx 0x444d4163
  126. #define signature_AMD_edx 0x69746e65
  127. #define signature_CENTAUR_ebx 0x746e6543
  128. #define signature_CENTAUR_ecx 0x736c7561
  129. #define signature_CENTAUR_edx 0x48727561
  130. #define signature_CYRIX_ebx 0x69727943
  131. #define signature_CYRIX_ecx 0x64616574
  132. #define signature_CYRIX_edx 0x736e4978
  133. #define signature_INTEL_ebx 0x756e6547
  134. #define signature_INTEL_ecx 0x6c65746e
  135. #define signature_INTEL_edx 0x49656e69
  136. #define signature_TM1_ebx 0x6e617254
  137. #define signature_TM1_ecx 0x55504361
  138. #define signature_TM1_edx 0x74656d73
  139. #define signature_TM2_ebx 0x756e6547
  140. #define signature_TM2_ecx 0x3638784d
  141. #define signature_TM2_edx 0x54656e69
  142. #define signature_NSC_ebx 0x646f6547
  143. #define signature_NSC_ecx 0x43534e20
  144. #define signature_NSC_edx 0x79622065
  145. #define signature_NEXGEN_ebx 0x4778654e
  146. #define signature_NEXGEN_ecx 0x6e657669
  147. #define signature_NEXGEN_edx 0x72446e65
  148. #define signature_RISE_ebx 0x65736952
  149. #define signature_RISE_ecx 0x65736952
  150. #define signature_RISE_edx 0x65736952
  151. #define signature_SIS_ebx 0x20536953
  152. #define signature_SIS_ecx 0x20536953
  153. #define signature_SIS_edx 0x20536953
  154. #define signature_UMC_ebx 0x20434d55
  155. #define signature_UMC_ecx 0x20434d55
  156. #define signature_UMC_edx 0x20434d55
  157. #define signature_VIA_ebx 0x20414956
  158. #define signature_VIA_ecx 0x20414956
  159. #define signature_VIA_edx 0x20414956
  160. #define signature_VORTEX_ebx 0x74726f56
  161. #define signature_VORTEX_ecx 0x436f5320
  162. #define signature_VORTEX_edx 0x36387865
  163. #ifndef __x86_64__
  164. /* At least one cpu (Winchip 2) does not set %ebx and %ecx
  165. for cpuid leaf 1. Forcibly zero the two registers before
  166. calling cpuid as a precaution. */
  167. #define __cpuid(level, a, b, c, d) \
  168. do { \
  169. if (__builtin_constant_p (level) && (level) != 1) \
  170. __asm__ ("cpuid\n\t" \
  171. : "=a" (a), "=b" (b), "=c" (c), "=d" (d) \
  172. : "0" (level)); \
  173. else \
  174. __asm__ ("cpuid\n\t" \
  175. : "=a" (a), "=b" (b), "=c" (c), "=d" (d) \
  176. : "0" (level), "1" (0), "2" (0)); \
  177. } while (0)
  178. #else
  179. #define __cpuid(level, a, b, c, d) \
  180. __asm__ ("cpuid\n\t" \
  181. : "=a" (a), "=b" (b), "=c" (c), "=d" (d) \
  182. : "0" (level))
  183. #endif
  184. #define __cpuid_count(level, count, a, b, c, d) \
  185. __asm__ ("cpuid\n\t" \
  186. : "=a" (a), "=b" (b), "=c" (c), "=d" (d) \
  187. : "0" (level), "2" (count))
  188. /* Return highest supported input value for cpuid instruction. ext can
  189. be either 0x0 or 0x80000000 to return highest supported value for
  190. basic or extended cpuid information. Function returns 0 if cpuid
  191. is not supported or whatever cpuid returns in eax register. If sig
  192. pointer is non-null, then first four bytes of the signature
  193. (as found in ebx register) are returned in location pointed by sig. */
  194. static __inline unsigned int
  195. __get_cpuid_max (unsigned int __ext, unsigned int *__sig)
  196. {
  197. unsigned int __eax, __ebx, __ecx, __edx;
  198. #ifndef __x86_64__
  199. /* See if we can use cpuid. On AMD64 we always can. */
  200. #if __GNUC__ >= 3
  201. __asm__ ("pushf{l|d}\n\t"
  202. "pushf{l|d}\n\t"
  203. "pop{l}\t%0\n\t"
  204. "mov{l}\t{%0, %1|%1, %0}\n\t"
  205. "xor{l}\t{%2, %0|%0, %2}\n\t"
  206. "push{l}\t%0\n\t"
  207. "popf{l|d}\n\t"
  208. "pushf{l|d}\n\t"
  209. "pop{l}\t%0\n\t"
  210. "popf{l|d}\n\t"
  211. : "=&r" (__eax), "=&r" (__ebx)
  212. : "i" (0x00200000));
  213. #else
  214. /* Host GCCs older than 3.0 weren't supporting Intel asm syntax
  215. nor alternatives in i386 code. */
  216. __asm__ ("pushfl\n\t"
  217. "pushfl\n\t"
  218. "popl\t%0\n\t"
  219. "movl\t%0, %1\n\t"
  220. "xorl\t%2, %0\n\t"
  221. "pushl\t%0\n\t"
  222. "popfl\n\t"
  223. "pushfl\n\t"
  224. "popl\t%0\n\t"
  225. "popfl\n\t"
  226. : "=&r" (__eax), "=&r" (__ebx)
  227. : "i" (0x00200000));
  228. #endif
  229. if (!((__eax ^ __ebx) & 0x00200000))
  230. return 0;
  231. #endif
  232. /* Host supports cpuid. Return highest supported cpuid input value. */
  233. __cpuid (__ext, __eax, __ebx, __ecx, __edx);
  234. if (__sig)
  235. *__sig = __ebx;
  236. return __eax;
  237. }
  238. /* Return cpuid data for requested cpuid leaf, as found in returned
  239. eax, ebx, ecx and edx registers. The function checks if cpuid is
  240. supported and returns 1 for valid cpuid information or 0 for
  241. unsupported cpuid leaf. All pointers are required to be non-null. */
  242. static __inline int
  243. __get_cpuid (unsigned int __leaf,
  244. unsigned int *__eax, unsigned int *__ebx,
  245. unsigned int *__ecx, unsigned int *__edx)
  246. {
  247. unsigned int __ext = __leaf & 0x80000000;
  248. unsigned int __maxlevel = __get_cpuid_max (__ext, 0);
  249. if (__maxlevel == 0 || __maxlevel < __leaf)
  250. return 0;
  251. __cpuid (__leaf, *__eax, *__ebx, *__ecx, *__edx);
  252. return 1;
  253. }
  254. /* Same as above, but sub-leaf can be specified. */
  255. static __inline int
  256. __get_cpuid_count (unsigned int __leaf, unsigned int __subleaf,
  257. unsigned int *__eax, unsigned int *__ebx,
  258. unsigned int *__ecx, unsigned int *__edx)
  259. {
  260. unsigned int __ext = __leaf & 0x80000000;
  261. unsigned int __maxlevel = __get_cpuid_max (__ext, 0);
  262. if (__maxlevel == 0 || __maxlevel < __leaf)
  263. return 0;
  264. __cpuid_count (__leaf, __subleaf, *__eax, *__ebx, *__ecx, *__edx);
  265. return 1;
  266. }