cpuid.h 9.5 KB

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