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 Hendersonstatic 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