@@ -101,7 +101,9 @@ typedef enum cpuid_inst_sets {
101
101
AES ,
102
102
PCLMULQDQ ,
103
103
MOVBE ,
104
- SHA_NI
104
+ SHA_NI ,
105
+ VAES ,
106
+ VPCLMULQDQ
105
107
} cpuid_inst_sets_t ;
106
108
107
109
/*
@@ -126,6 +128,8 @@ typedef struct cpuid_feature_desc {
126
128
#define _AES_BIT (1U << 25)
127
129
#define _PCLMULQDQ_BIT (1U << 1)
128
130
#define _MOVBE_BIT (1U << 22)
131
+ #define _VAES_BIT (1U << 9)
132
+ #define _VPCLMULQDQ_BIT (1U << 10)
129
133
#define _SHA_NI_BIT (1U << 29)
130
134
131
135
/*
@@ -156,6 +160,8 @@ static const cpuid_feature_desc_t cpuid_features[] = {
156
160
[PCLMULQDQ ] = {1U , 0U , _PCLMULQDQ_BIT , ECX },
157
161
[MOVBE ] = {1U , 0U , _MOVBE_BIT , ECX },
158
162
[SHA_NI ] = {7U , 0U , _SHA_NI_BIT , EBX },
163
+ [VAES ] = {7U , 0U , _VAES_BIT , ECX },
164
+ [VPCLMULQDQ ] = {7U , 0U , _VPCLMULQDQ_BIT , ECX },
159
165
};
160
166
161
167
/*
@@ -230,6 +236,8 @@ CPUID_FEATURE_CHECK(aes, AES);
230
236
CPUID_FEATURE_CHECK (pclmulqdq , PCLMULQDQ );
231
237
CPUID_FEATURE_CHECK (movbe , MOVBE );
232
238
CPUID_FEATURE_CHECK (shani , SHA_NI );
239
+ CPUID_FEATURE_CHECK (vaes , VAES );
240
+ CPUID_FEATURE_CHECK (vpclmulqdq , VPCLMULQDQ );
233
241
234
242
/*
235
243
* Detect register set support
@@ -380,6 +388,24 @@ zfs_shani_available(void)
380
388
return (__cpuid_has_shani ());
381
389
}
382
390
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
+
383
409
/*
384
410
* AVX-512 family of instruction sets:
385
411
*
0 commit comments