@@ -101,7 +101,9 @@ typedef enum cpuid_inst_sets {
101101 AES ,
102102 PCLMULQDQ ,
103103 MOVBE ,
104- SHA_NI
104+ SHA_NI ,
105+ VAES ,
106+ VPCLMULQDQ
105107} cpuid_inst_sets_t ;
106108
107109/*
@@ -126,6 +128,8 @@ typedef struct cpuid_feature_desc {
126128#define _AES_BIT (1U << 25)
127129#define _PCLMULQDQ_BIT (1U << 1)
128130#define _MOVBE_BIT (1U << 22)
131+ #define _VAES_BIT (1U << 9)
132+ #define _VPCLMULQDQ_BIT (1U << 10)
129133#define _SHA_NI_BIT (1U << 29)
130134
131135/*
@@ -156,6 +160,8 @@ static const cpuid_feature_desc_t cpuid_features[] = {
156160 [PCLMULQDQ ] = {1U , 0U , _PCLMULQDQ_BIT , ECX },
157161 [MOVBE ] = {1U , 0U , _MOVBE_BIT , ECX },
158162 [SHA_NI ] = {7U , 0U , _SHA_NI_BIT , EBX },
163+ [VAES ] = {7U , 0U , _VAES_BIT , ECX },
164+ [VPCLMULQDQ ] = {7U , 0U , _VPCLMULQDQ_BIT , ECX },
159165};
160166
161167/*
@@ -230,6 +236,8 @@ CPUID_FEATURE_CHECK(aes, AES);
230236CPUID_FEATURE_CHECK (pclmulqdq , PCLMULQDQ );
231237CPUID_FEATURE_CHECK (movbe , MOVBE );
232238CPUID_FEATURE_CHECK (shani , SHA_NI );
239+ CPUID_FEATURE_CHECK (vaes , VAES );
240+ CPUID_FEATURE_CHECK (vpclmulqdq , VPCLMULQDQ );
233241
234242/*
235243 * Detect register set support
@@ -380,6 +388,24 @@ zfs_shani_available(void)
380388 return (__cpuid_has_shani ());
381389}
382390
391+ /*
392+ * Check if VAES instruction is available
393+ */
394+ static inline boolean_t
395+ zfs_vaes_available (void )
396+ {
397+ return (__cpuid_has_vaes ());
398+ }
399+
400+ /*
401+ * Check if VPCLMULQDQ instruction is available
402+ */
403+ static inline boolean_t
404+ zfs_vpclmulqdq_available (void )
405+ {
406+ return (__cpuid_has_vpclmulqdq ());
407+ }
408+
383409/*
384410 * AVX-512 family of instruction sets:
385411 *
0 commit comments