summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/common/elfcap/elfcap.c8
-rw-r--r--usr/src/common/elfcap/elfcap.h2
-rw-r--r--usr/src/uts/common/sys/auxv_386.h4
-rw-r--r--usr/src/uts/i86pc/os/cpuid.c18
-rw-r--r--usr/src/uts/intel/sys/x86_archext.h10
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);