diff options
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/common/elfcap/elfcap.c | 8 | ||||
-rw-r--r-- | usr/src/common/elfcap/elfcap.h | 2 | ||||
-rw-r--r-- | usr/src/uts/common/sys/auxv_386.h | 4 | ||||
-rw-r--r-- | usr/src/uts/i86pc/os/cpuid.c | 18 | ||||
-rw-r--r-- | usr/src/uts/intel/sys/x86_archext.h | 10 |
5 files changed, 36 insertions, 6 deletions
diff --git a/usr/src/common/elfcap/elfcap.c b/usr/src/common/elfcap/elfcap.c index 25cef1e307..d63db8e981 100644 --- a/usr/src/common/elfcap/elfcap.c +++ b/usr/src/common/elfcap/elfcap.c @@ -332,6 +332,14 @@ static const elfcap_desc_t hw2_386[ELFCAP_NUM_HW2_386] = { AV_386_2_AVX2, STRDESC("AV_386_2_AVX2"), STRDESC("AVX2"), STRDESC("avx2"), }, + { /* 0x00000040 */ + AV_386_2_ADX, STRDESC("AV_386_2_ADX"), + STRDESC("ADX"), STRDESC("adx"), + }, + { /* 0x00000080 */ + AV_386_2_RDSEED, STRDESC("AV_386_2_RDSEED"), + STRDESC("RDSEED"), STRDESC("rdseed"), + } }; /* diff --git a/usr/src/common/elfcap/elfcap.h b/usr/src/common/elfcap/elfcap.h index fc2101ac87..f3e29a6a97 100644 --- a/usr/src/common/elfcap/elfcap.h +++ b/usr/src/common/elfcap/elfcap.h @@ -115,7 +115,7 @@ typedef enum { #define ELFCAP_NUM_SF1 3 #define ELFCAP_NUM_HW1_SPARC 17 #define ELFCAP_NUM_HW1_386 32 -#define ELFCAP_NUM_HW2_386 6 +#define ELFCAP_NUM_HW2_386 8 /* diff --git a/usr/src/uts/common/sys/auxv_386.h b/usr/src/uts/common/sys/auxv_386.h index ec4c8b0f19..a3256a464f 100644 --- a/usr/src/uts/common/sys/auxv_386.h +++ b/usr/src/uts/common/sys/auxv_386.h @@ -89,10 +89,12 @@ extern "C" { #define AV_386_2_BMI2 0x00008 /* BMI2 insns */ #define AV_386_2_FMA 0x00010 /* FMA insns */ #define AV_386_2_AVX2 0x00020 /* AVX2 insns */ +#define AV_386_2_ADX 0x00040 /* ADX insns */ +#define AV_386_2_RDSEED 0x00080 /* RDSEED insn */ #define FMT_AV_386_2 \ "\020" \ - "\06avx2\05fma\04bmi2\03bmi1\02rdrand\01f16c" + "\10rdseed\07adx\06avx2\05fma\04bmi2\03bmi1\02rdrand\01f16c" #ifdef __cplusplus } diff --git a/usr/src/uts/i86pc/os/cpuid.c b/usr/src/uts/i86pc/os/cpuid.c index f75ef40ac6..9b55ba9553 100644 --- a/usr/src/uts/i86pc/os/cpuid.c +++ b/usr/src/uts/i86pc/os/cpuid.c @@ -171,7 +171,9 @@ static char *x86_feature_names[NUM_X86_FEATURES] = { "bmi2", "fma", "smep", - "smap" + "smap", + "adx", + "rdseed" }; boolean_t @@ -1264,6 +1266,11 @@ cpuid_pass1(cpu_t *cpu, uchar_t *featureset) disable_smap == 0) add_x86_feature(featureset, X86FSET_SMAP); #endif + if (ecp->cp_ebx & CPUID_INTC_EBX_7_0_RDSEED) + add_x86_feature(featureset, X86FSET_RDSEED); + + if (ecp->cp_ebx & CPUID_INTC_EBX_7_0_ADX) + add_x86_feature(featureset, X86FSET_ADX); } /* @@ -2739,6 +2746,10 @@ cpuid_pass4(cpu_t *cpu, uint_t *hwcap_out) *ebx &= ~CPUID_INTC_EBX_7_0_BMI2; if (!is_x86_feature(x86_featureset, X86FSET_AVX2)) *ebx &= ~CPUID_INTC_EBX_7_0_AVX2; + if (!is_x86_feature(x86_featureset, X86FSET_RDSEED)) + *ebx &= ~CPUID_INTC_EBX_7_0_RDSEED; + if (!is_x86_feature(x86_featureset, X86FSET_ADX)) + *ebx &= ~CPUID_INTC_EBX_7_0_ADX; /* * [no explicit support required beyond x87 fp context] @@ -2808,6 +2819,11 @@ cpuid_pass4(cpu_t *cpu, uint_t *hwcap_out) if (*ecx & CPUID_INTC_ECX_RDRAND) hwcap_flags_2 |= AV_386_2_RDRAND; + if (*ebx & CPUID_INTC_EBX_7_0_ADX) + hwcap_flags_2 |= AV_386_2_ADX; + if (*ebx & CPUID_INTC_EBX_7_0_RDSEED) + hwcap_flags_2 |= AV_386_2_RDSEED; + } /* Detect systems with a potential CPUID limit */ diff --git a/usr/src/uts/intel/sys/x86_archext.h b/usr/src/uts/intel/sys/x86_archext.h index 8d6ce98339..322419f7e1 100644 --- a/usr/src/uts/intel/sys/x86_archext.h +++ b/usr/src/uts/intel/sys/x86_archext.h @@ -28,7 +28,7 @@ * All rights reserved. */ /* - * Copyright (c) 2015, Joyent, Inc. + * Copyright 2015 Joyent, Inc. * Copyright 2012 Jens Elkner <jel+illumos@cs.uni-magdeburg.de> * Copyright 2012 Hans Rosenfeld <rosenfeld@grumpf.hope-2000.org> * Copyright 2014 Josef 'Jeff' Sipek <jeffpc@josefsipek.net> @@ -203,7 +203,9 @@ extern "C" { #define CPUID_INTC_EBX_7_0_BMI1 0x00000008 /* BMI1 instrs */ #define CPUID_INTC_EBX_7_0_AVX2 0x00000020 /* AVX2 supported */ #define CPUID_INTC_EBX_7_0_SMEP 0x00000080 /* SMEP in CR4 */ -#define CPUID_INTC_EBX_7_0_BMI2 0x00000100 /* BMI2 Instrs */ +#define CPUID_INTC_EBX_7_0_BMI2 0x00000100 /* BMI2 instrs */ +#define CPUID_INTC_EBX_7_0_RDSEED 0x00040000 /* RDSEED instr */ +#define CPUID_INTC_EBX_7_0_ADX 0x00080000 /* ADX instrs */ #define CPUID_INTC_EBX_7_0_SMAP 0x00100000 /* SMAP in CR 4 */ #define P5_MCHADDR 0x0 @@ -381,6 +383,8 @@ extern "C" { #define X86FSET_FMA 44 #define X86FSET_SMEP 45 #define X86FSET_SMAP 46 +#define X86FSET_ADX 47 +#define X86FSET_RDSEED 48 /* * flags to patch tsc_read routine. @@ -641,7 +645,7 @@ extern "C" { #if defined(_KERNEL) || defined(_KMEMUSER) -#define NUM_X86_FEATURES 47 +#define NUM_X86_FEATURES 49 extern uchar_t x86_featureset[]; extern void free_x86_featureset(void *featureset); |