xref: /openbmc/qemu/include/qemu/cpuid.h (revision d6493dbb)
15dd89908SRichard Henderson /* cpuid.h: Macros to identify the properties of an x86 host.
25dd89908SRichard Henderson  *
35dd89908SRichard Henderson  * This work is licensed under the terms of the GNU GPL, version 2 or later.
45dd89908SRichard Henderson  * See the COPYING file in the top-level directory.
55dd89908SRichard Henderson  */
65dd89908SRichard Henderson 
75dd89908SRichard Henderson #ifndef QEMU_CPUID_H
85dd89908SRichard Henderson #define QEMU_CPUID_H
95dd89908SRichard Henderson 
105dd89908SRichard Henderson #ifndef CONFIG_CPUID_H
115dd89908SRichard Henderson # error "<cpuid.h> is unusable with this compiler"
125dd89908SRichard Henderson #endif
135dd89908SRichard Henderson 
145dd89908SRichard Henderson #include <cpuid.h>
155dd89908SRichard Henderson 
165dd89908SRichard Henderson /* Cover the uses that we have within qemu.  */
175dd89908SRichard Henderson /* ??? Irritating that we have the same information in target/i386/.  */
185dd89908SRichard Henderson 
195dd89908SRichard Henderson /* Leaf 1, %edx */
205dd89908SRichard Henderson #ifndef bit_CMOV
215dd89908SRichard Henderson #define bit_CMOV        (1 << 15)
225dd89908SRichard Henderson #endif
235dd89908SRichard Henderson #ifndef bit_SSE2
245dd89908SRichard Henderson #define bit_SSE2        (1 << 26)
255dd89908SRichard Henderson #endif
265dd89908SRichard Henderson 
275dd89908SRichard Henderson /* Leaf 1, %ecx */
28*d6493dbbSRichard Henderson #ifndef bit_PCLMUL
29*d6493dbbSRichard Henderson #define bit_PCLMUL      (1 << 1)
30*d6493dbbSRichard Henderson #endif
315dd89908SRichard Henderson #ifndef bit_SSE4_1
325dd89908SRichard Henderson #define bit_SSE4_1      (1 << 19)
335dd89908SRichard Henderson #endif
345dd89908SRichard Henderson #ifndef bit_MOVBE
355dd89908SRichard Henderson #define bit_MOVBE       (1 << 22)
365dd89908SRichard Henderson #endif
375dd89908SRichard Henderson #ifndef bit_OSXSAVE
385dd89908SRichard Henderson #define bit_OSXSAVE     (1 << 27)
395dd89908SRichard Henderson #endif
405dd89908SRichard Henderson #ifndef bit_AVX
415dd89908SRichard Henderson #define bit_AVX         (1 << 28)
425dd89908SRichard Henderson #endif
435dd89908SRichard Henderson 
445dd89908SRichard Henderson /* Leaf 7, %ebx */
455dd89908SRichard Henderson #ifndef bit_BMI
465dd89908SRichard Henderson #define bit_BMI         (1 << 3)
475dd89908SRichard Henderson #endif
485dd89908SRichard Henderson #ifndef bit_AVX2
495dd89908SRichard Henderson #define bit_AVX2        (1 << 5)
505dd89908SRichard Henderson #endif
51ba597b66SRichard Henderson #ifndef bit_BMI2
52ba597b66SRichard Henderson #define bit_BMI2        (1 << 8)
53ba597b66SRichard Henderson #endif
5427f08ea1SRobert Hoo #ifndef bit_AVX512F
5527f08ea1SRobert Hoo #define bit_AVX512F     (1 << 16)
5627f08ea1SRobert Hoo #endif
57ba597b66SRichard Henderson #ifndef bit_AVX512DQ
58ba597b66SRichard Henderson #define bit_AVX512DQ    (1 << 17)
59ba597b66SRichard Henderson #endif
60ba597b66SRichard Henderson #ifndef bit_AVX512BW
61ba597b66SRichard Henderson #define bit_AVX512BW    (1 << 30)
62ba597b66SRichard Henderson #endif
63ba597b66SRichard Henderson #ifndef bit_AVX512VL
64ba597b66SRichard Henderson #define bit_AVX512VL    (1u << 31)
65ba597b66SRichard Henderson #endif
66ba597b66SRichard Henderson 
67ba597b66SRichard Henderson /* Leaf 7, %ecx */
68ba597b66SRichard Henderson #ifndef bit_AVX512VBMI2
69ba597b66SRichard Henderson #define bit_AVX512VBMI2 (1 << 6)
705dd89908SRichard Henderson #endif
715dd89908SRichard Henderson 
725dd89908SRichard Henderson /* Leaf 0x80000001, %ecx */
735dd89908SRichard Henderson #ifndef bit_LZCNT
745dd89908SRichard Henderson #define bit_LZCNT       (1 << 5)
755dd89908SRichard Henderson #endif
765dd89908SRichard Henderson 
776d3f2e3cSRichard Henderson /*
786d3f2e3cSRichard Henderson  * Signatures for different CPU implementations as returned from Leaf 0.
796d3f2e3cSRichard Henderson  */
806d3f2e3cSRichard Henderson 
816d3f2e3cSRichard Henderson #ifndef signature_INTEL_ecx
826d3f2e3cSRichard Henderson /* "Genu" "ineI" "ntel" */
836d3f2e3cSRichard Henderson #define signature_INTEL_ebx     0x756e6547
846d3f2e3cSRichard Henderson #define signature_INTEL_edx     0x49656e69
856d3f2e3cSRichard Henderson #define signature_INTEL_ecx     0x6c65746e
866d3f2e3cSRichard Henderson #endif
876d3f2e3cSRichard Henderson 
886d3f2e3cSRichard Henderson #ifndef signature_AMD_ecx
896d3f2e3cSRichard Henderson /* "Auth" "enti" "cAMD" */
906d3f2e3cSRichard Henderson #define signature_AMD_ebx       0x68747541
916d3f2e3cSRichard Henderson #define signature_AMD_edx       0x69746e65
926d3f2e3cSRichard Henderson #define signature_AMD_ecx       0x444d4163
936d3f2e3cSRichard Henderson #endif
946d3f2e3cSRichard Henderson 
xgetbv_low(unsigned c)955d133dd8SRichard Henderson static inline unsigned xgetbv_low(unsigned c)
965d133dd8SRichard Henderson {
975d133dd8SRichard Henderson     unsigned a, d;
985d133dd8SRichard Henderson     asm("xgetbv" : "=a"(a), "=d"(d) : "c"(c));
995d133dd8SRichard Henderson     return a;
1005d133dd8SRichard Henderson }
1015d133dd8SRichard Henderson 
1025dd89908SRichard Henderson #endif /* QEMU_CPUID_H */
103