[haiku-commits] haiku: hrev51756 - headers/private/kernel/arch/x86 src/system/kernel/arch/x86

  • From: jerome.duval@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sat, 13 Jan 2018 03:35:30 -0500 (EST)

hrev51756 adds 1 changeset to branch 'master'
old head: ac9e464b78d486514f953adafdb5f0b63b8e0203
new head: 94090214322c553a7957f80f74b2be64efee8c38
overview: 
http://cgit.haiku-os.org/haiku/log/?qt=range&q=94090214322c+%5Eac9e464b78d4

----------------------------------------------------------------------------

94090214322c: kernel: x86: add cpuid feature 7 flags.

                                   [ Jérôme Duval <jerome.duval@xxxxxxxxx> ]

----------------------------------------------------------------------------

Revision:    hrev51756
Commit:      94090214322c553a7957f80f74b2be64efee8c38
URL:         http://cgit.haiku-os.org/haiku/commit/?id=94090214322c
Author:      Jérôme Duval <jerome.duval@xxxxxxxxx>
Date:        Thu Dec 21 21:56:59 2017 UTC

----------------------------------------------------------------------------

2 files changed, 130 insertions(+), 1 deletion(-)
headers/private/kernel/arch/x86/arch_cpu.h | 60 ++++++++++++++++++++++
src/system/kernel/arch/x86/arch_cpu.cpp    | 71 +++++++++++++++++++++++++-

----------------------------------------------------------------------------

diff --git a/headers/private/kernel/arch/x86/arch_cpu.h 
b/headers/private/kernel/arch/x86/arch_cpu.h
index 7f1731f645..d27f8e3dc1 100644
--- a/headers/private/kernel/arch/x86/arch_cpu.h
+++ b/headers/private/kernel/arch/x86/arch_cpu.h
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2018, Jérôme Duval, jerome.duval@xxxxxxxxx.
  * Copyright 2002-2009, Axel Dörfler, axeld@xxxxxxxxxxxxxxxx.
  * Copyright 2012, Alex Smith, alex@xxxxxxxxxxxxxxxx.
  * Distributed under the terms of the MIT License.
@@ -206,6 +207,62 @@
 #define IA32_FEATURE_APERFMPERF        (1 << 0) //IA32_APERF, IA32_MPERF
 #define IA32_FEATURE_EPB       (1 << 3) //IA32_ENERGY_PERF_BIAS
 
+// x86 features from cpuid eax 7, ebx register
+// reference http://www.intel.com/Assets/en_US/PDF/appnote/241618.pdf ;(Table 
3-8)
+#define IA32_FEATURE_TSC_ADJUST        (1 << 1) // IA32_TSC_ADJUST MSR 
supported
+#define IA32_FEATURE_SGX               (1 << 2) // Software Guard Extensions
+#define IA32_FEATURE_BMI1              (1 << 3) // Bit Manipulation 
Instruction Set 1
+#define IA32_FEATURE_HLE               (1 << 4) // Hardware Lock Elision
+#define IA32_FEATURE_AVX2              (1 << 5) // Advanced Vector Extensions 2
+#define IA32_FEATURE_SMEP              (1 << 7) // Supervisor-Mode Execution 
Prevention
+#define IA32_FEATURE_BMI2              (1 << 8) // Bit Manipulation 
Instruction Set 2
+#define IA32_FEATURE_ERMS              (1 << 9) // Enhanced REP MOVSB/STOSB
+#define IA32_FEATURE_INVPCID   (1 << 10) // INVPCID instruction
+#define IA32_FEATURE_RTM               (1 << 11) // Transactional 
Synchronization Extensions
+#define IA32_FEATURE_CQM               (1 << 12) // Platform Quality of 
Service Monitoring
+#define IA32_FEATURE_MPX               (1 << 14) // Memory Protection 
Extensions
+#define IA32_FEATURE_RDT_A             (1 << 15) // Resource Director 
Technology Allocation
+#define IA32_FEATURE_AVX512F   (1 << 16) // AVX-512 Foundation
+#define IA32_FEATURE_AVX512DQ  (1 << 17) // AVX-512 Doubleword and Quadword 
Instructions
+#define IA32_FEATURE_RDSEED            (1 << 18) // RDSEED instruction
+#define IA32_FEATURE_ADX               (1 << 19) // ADX (Multi-Precision 
Add-Carry Instruction Extensions)
+#define IA32_FEATURE_SMAP              (1 << 20) // Supervisor Mode Access 
Prevention
+#define IA32_FEATURE_AVX512IFMA        (1 << 21) // AVX-512 Integer Fused 
Multiply-Add Instructions
+#define IA32_FEATURE_PCOMMIT   (1 << 22) // PCOMMIT instruction
+#define IA32_FEATURE_CLFLUSHOPT        (1 << 23) // CLFLUSHOPT instruction
+#define IA32_FEATURE_CLWB              (1 << 24) // CLWB instruction
+#define IA32_FEATURE_INTEL_PT  (1 << 25) // Intel Processor Trace
+#define IA32_FEATURE_AVX512PF  (1 << 26) // AVX-512 Prefetch Instructions
+#define IA32_FEATURE_AVX512ER  (1 << 27) // AVX-512 Exponential and Reciprocal 
Instructions
+#define IA32_FEATURE_AVX512CD  (1 << 28) // AVX-512 Conflict Detection 
Instructions
+#define IA32_FEATURE_SHA_NI            (1 << 29) // SHA extensions
+#define IA32_FEATURE_AVX512BW  (1 << 30) // AVX-512 Byte and Word Instructions
+#define IA32_FEATURE_AVX512VI  (1 << 31) // AVX-512 Vector Length Extensions
+
+// x86 features from cpuid eax 7, ecx register
+// reference http://www.intel.com/Assets/en_US/PDF/appnote/241618.pdf ;(Table 
3-8)
+// https://en.wikipedia.org/wiki/CPUID#EAX=7,_ECX=0:_Extended_Features
+#define IA32_FEATURE_AVX512VMBI                (1 << 1) // AVX-512 Vector Bit 
Manipulation Instructions
+#define IA32_FEATURE_UMIP                      (1 << 2) // User-mode 
Instruction Prevention
+#define IA32_FEATURE_PKU                       (1 << 3) // Memory Protection 
Keys for User-mode pages
+#define IA32_FEATURE_OSPKE                     (1 << 4) // PKU enabled by OS
+#define IA32_FEATURE_AVX512VMBI2       (1 << 6) // AVX-512 Vector Bit 
Manipulation Instructions 2
+#define IA32_FEATURE_GFNI                      (1 << 8) // Galois Field 
instructions
+#define IA32_FEATURE_VAES                      (1 << 9) // AES instruction set 
(VEX-256/EVEX)
+#define IA32_FEATURE_VPCLMULQDQ                (1 << 10) // CLMUL instruction 
set (VEX-256/EVEX)
+#define IA32_FEATURE_AVX512_VNNI       (1 << 11) // AVX-512 Vector Neural 
Network Instructions
+#define IA32_FEATURE_AVX512_BITALG     (1 << 12) // AVX-512 BITALG instructions
+#define IA32_FEATURE_AVX512_VPOPCNTDQ (1 << 14) // AVX-512 Vector Population 
Count D/Q
+#define IA32_FEATURE_LA57                      (1 << 16) // 5-level page tables
+#define IA32_FEATURE_RDPID                     (1 << 22) // RDPID Instruction
+#define IA32_FEATURE_SGX_LC                    (1 << 30) // SGX Launch 
Configuration
+
+// x86 features from cpuid eax 7, edx register
+// https://en.wikipedia.org/wiki/CPUID#EAX=7,_ECX=0:_Extended_Features
+#define IA32_FEATURE_AVX512_4VNNIW     (1 << 2) // AVX-512 4-register Neural 
Network Instructions
+#define IA32_FEATURE_AVX512_4FMAPS     (1 << 3) // AVX-512 4-register Multiply 
Accumulation Single precision
+
+
 // x86 defined features from cpuid eax 0x80000007, edx register
 #define IA32_FEATURE_INVARIANT_TSC             (1 << 8)
 
@@ -294,6 +351,9 @@ enum x86_feature_type {
        FEATURE_5_ECX,                  // cpuid eax=5, ecx register
        FEATURE_6_EAX,          // cpuid eax=6, eax registers
        FEATURE_6_ECX,          // cpuid eax=6, ecx registers
+       FEATURE_7_EBX,          // cpuid eax=7, ebx registers
+       FEATURE_7_ECX,          // cpuid eax=7, ecx registers
+       FEATURE_7_EDX,          // cpuid eax=7, edx registers
        FEATURE_EXT_7_EDX,              // cpuid eax=0x80000007, edx register
 
        FEATURE_NUM
diff --git a/src/system/kernel/arch/x86/arch_cpu.cpp 
b/src/system/kernel/arch/x86/arch_cpu.cpp
index 930144d57b..53de951a20 100644
--- a/src/system/kernel/arch/x86/arch_cpu.cpp
+++ b/src/system/kernel/arch/x86/arch_cpu.cpp
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2018, Jérôme Duval, jerome.duval@xxxxxxxxx.
  * Copyright 2002-2010, Axel Dörfler, axeld@xxxxxxxxxxxxxxxx.
  * Copyright 2013, Paweł Dziepak, pdziepak@xxxxxxxxxxx.
  * Copyright 2012, Alex Smith, alex@xxxxxxxxxxxxxxxx.
@@ -326,7 +327,7 @@ x86_init_fpu(void)
 static void
 dump_feature_string(int currentCPU, cpu_ent* cpu)
 {
-       char features[384];
+       char features[512];
        features[0] = 0;
 
        if (cpu->arch.feature[FEATURE_COMMON] & IA32_FEATURE_FPU)
@@ -477,6 +478,64 @@ dump_feature_string(int currentCPU, cpu_ent* cpu)
                strlcat(features, "aperfmperf ", sizeof(features));
        if (cpu->arch.feature[FEATURE_6_ECX] & IA32_FEATURE_EPB)
                strlcat(features, "epb ", sizeof(features));
+       if (cpu->arch.feature[FEATURE_7_EBX] & IA32_FEATURE_TSC_ADJUST)
+               strlcat(features, "tsc_adjust ", sizeof(features));
+       if (cpu->arch.feature[FEATURE_7_EBX] & IA32_FEATURE_SGX)
+               strlcat(features, "sgx ", sizeof(features));
+       if (cpu->arch.feature[FEATURE_7_EBX] & IA32_FEATURE_BMI1)
+               strlcat(features, "bmi1 ", sizeof(features));
+       if (cpu->arch.feature[FEATURE_7_EBX] & IA32_FEATURE_HLE)
+               strlcat(features, "hle ", sizeof(features));
+       if (cpu->arch.feature[FEATURE_7_EBX] & IA32_FEATURE_AVX2)
+               strlcat(features, "avx2 ", sizeof(features));
+       if (cpu->arch.feature[FEATURE_7_EBX] & IA32_FEATURE_SMEP)
+               strlcat(features, "smep ", sizeof(features));
+       if (cpu->arch.feature[FEATURE_7_EBX] & IA32_FEATURE_BMI2)
+               strlcat(features, "bmi2 ", sizeof(features));
+       if (cpu->arch.feature[FEATURE_7_EBX] & IA32_FEATURE_ERMS)
+               strlcat(features, "erms ", sizeof(features));
+       if (cpu->arch.feature[FEATURE_7_EBX] & IA32_FEATURE_INVPCID)
+               strlcat(features, "invpcid ", sizeof(features));
+       if (cpu->arch.feature[FEATURE_7_EBX] & IA32_FEATURE_RTM)
+               strlcat(features, "rtm ", sizeof(features));
+       if (cpu->arch.feature[FEATURE_7_EBX] & IA32_FEATURE_CQM)
+               strlcat(features, "cqm ", sizeof(features));
+       if (cpu->arch.feature[FEATURE_7_EBX] & IA32_FEATURE_MPX)
+               strlcat(features, "mpx ", sizeof(features));
+       if (cpu->arch.feature[FEATURE_7_EBX] & IA32_FEATURE_RDT_A)
+               strlcat(features, "rdt_a ", sizeof(features));
+       if (cpu->arch.feature[FEATURE_7_EBX] & IA32_FEATURE_AVX512F)
+               strlcat(features, "avx512f ", sizeof(features));
+       if (cpu->arch.feature[FEATURE_7_EBX] & IA32_FEATURE_AVX512DQ)
+               strlcat(features, "avx512dq ", sizeof(features));
+       if (cpu->arch.feature[FEATURE_7_EBX] & IA32_FEATURE_RDSEED)
+               strlcat(features, "rdseed ", sizeof(features));
+       if (cpu->arch.feature[FEATURE_7_EBX] & IA32_FEATURE_ADX)
+               strlcat(features, "adx ", sizeof(features));
+       if (cpu->arch.feature[FEATURE_7_EBX] & IA32_FEATURE_SMAP)
+               strlcat(features, "smap ", sizeof(features));
+       if (cpu->arch.feature[FEATURE_7_EBX] & IA32_FEATURE_AVX512IFMA)
+               strlcat(features, "avx512ifma ", sizeof(features));
+       if (cpu->arch.feature[FEATURE_7_EBX] & IA32_FEATURE_PCOMMIT)
+               strlcat(features, "pcommit ", sizeof(features));
+       if (cpu->arch.feature[FEATURE_7_EBX] & IA32_FEATURE_CLFLUSHOPT)
+               strlcat(features, "cflushopt ", sizeof(features));
+       if (cpu->arch.feature[FEATURE_7_EBX] & IA32_FEATURE_CLWB)
+               strlcat(features, "clwb ", sizeof(features));
+       if (cpu->arch.feature[FEATURE_7_EBX] & IA32_FEATURE_INTEL_PT)
+               strlcat(features, "intel_pt ", sizeof(features));
+       if (cpu->arch.feature[FEATURE_7_EBX] & IA32_FEATURE_AVX512PF)
+               strlcat(features, "avx512pf ", sizeof(features));
+       if (cpu->arch.feature[FEATURE_7_EBX] & IA32_FEATURE_AVX512ER)
+               strlcat(features, "avx512er ", sizeof(features));
+       if (cpu->arch.feature[FEATURE_7_EBX] & IA32_FEATURE_AVX512CD)
+               strlcat(features, "avx512cd ", sizeof(features));
+       if (cpu->arch.feature[FEATURE_7_EBX] & IA32_FEATURE_SHA_NI)
+               strlcat(features, "sha_ni ", sizeof(features));
+       if (cpu->arch.feature[FEATURE_7_EBX] & IA32_FEATURE_AVX512BW)
+               strlcat(features, "avx512bw ", sizeof(features));
+       if (cpu->arch.feature[FEATURE_7_EBX] & IA32_FEATURE_AVX512VI)
+               strlcat(features, "avx512vi ", sizeof(features));
 
        dprintf("CPU %d: features: %s\n", currentCPU, features);
 }
@@ -806,6 +865,9 @@ detect_cpu(int currentCPU)
        cpu->arch.feature[FEATURE_COMMON] = 0;
        cpu->arch.feature[FEATURE_EXT] = 0;
        cpu->arch.feature[FEATURE_EXT_AMD] = 0;
+       cpu->arch.feature[FEATURE_7_EBX] = 0;
+       cpu->arch.feature[FEATURE_7_ECX] = 0;
+       cpu->arch.feature[FEATURE_7_EDX] = 0;
        cpu->arch.model_name[0] = 0;
 
        // print some fun data
@@ -915,6 +977,13 @@ detect_cpu(int currentCPU)
                cpu->arch.feature[FEATURE_6_ECX] = cpuid.regs.ecx;
        }
 
+       if (maxBasicLeaf >= 7) {
+               get_current_cpuid(&cpuid, 7, 0);
+               cpu->arch.feature[FEATURE_7_EBX] = cpuid.regs.ebx;
+               cpu->arch.feature[FEATURE_7_ECX] = cpuid.regs.ecx;
+               cpu->arch.feature[FEATURE_7_EDX] = cpuid.regs.edx;
+       }
+
        if (maxExtendedLeaf >= 0x80000007) {
                get_current_cpuid(&cpuid, 0x80000007, 0);
                cpu->arch.feature[FEATURE_EXT_7_EDX] = cpuid.regs.edx;


Other related posts:

  • » [haiku-commits] haiku: hrev51756 - headers/private/kernel/arch/x86 src/system/kernel/arch/x86 - jerome . duval