AVX512VBMI,
AVX512PF,
AVX512ER,
- AVX512VL
+ AVX512VL,
+ AES,
+ PCLMULQDQ
} cpuid_inst_sets_t;
/*
#define _AVX512PF_BIT (_AVX512F_BIT | (1U << 26))
#define _AVX512ER_BIT (_AVX512F_BIT | (1U << 27))
#define _AVX512VL_BIT (1U << 31) /* if used also check other levels */
+#define _AES_BIT (1U << 25)
+#define _PCLMULQDQ_BIT (1U << 1)
/*
* Descriptions of supported instruction sets
[AVX512VBMI] = {7U, 0U, _AVX512VBMI_BIT, ECX },
[AVX512PF] = {7U, 0U, _AVX512PF_BIT, EBX },
[AVX512ER] = {7U, 0U, _AVX512ER_BIT, EBX },
- [AVX512VL] = {7U, 0U, _AVX512ER_BIT, EBX }
+ [AVX512VL] = {7U, 0U, _AVX512ER_BIT, EBX },
+ [AES] = {1U, 0U, _AES_BIT, ECX },
+ [PCLMULQDQ] = {1U, 0U, _PCLMULQDQ_BIT, ECX },
};
/*
CPUID_FEATURE_CHECK(avx512pf, AVX512PF);
CPUID_FEATURE_CHECK(avx512er, AVX512ER);
CPUID_FEATURE_CHECK(avx512vl, AVX512VL);
+CPUID_FEATURE_CHECK(aes, AES);
+CPUID_FEATURE_CHECK(pclmulqdq, PCLMULQDQ);
#endif /* !defined(_KERNEL) */
#endif
}
+/*
+ * Check if AES instruction set is available
+ */
+static inline boolean_t
+zfs_aes_available(void)
+{
+#if defined(_KERNEL) && defined(X86_FEATURE_AES)
+ return (!!boot_cpu_has(X86_FEATURE_AES));
+#elif defined(_KERNEL) && !defined(X86_FEATURE_AES)
+ return (B_FALSE);
+#else
+ return (__cpuid_has_aes());
+#endif
+}
+
+/*
+ * Check if PCLMULQDQ instruction set is available
+ */
+static inline boolean_t
+zfs_pclmulqdq_available(void)
+{
+#if defined(_KERNEL) && defined(X86_FEATURE_PCLMULQDQ)
+ return (!!boot_cpu_has(X86_FEATURE_PCLMULQDQ));
+#elif defined(_KERNEL) && !defined(X86_FEATURE_PCLMULQDQ)
+ return (B_FALSE);
+#else
+ return (__cpuid_has_pclmulqdq());
+#endif
+}
/*
* AVX-512 family of instruction sets: