Skip to content

Commit 3547a35

Browse files
robnbehlendorf
authored andcommitted
simd: detect and surface support for Intel SHA512 extensions
Recent Intel CPUs (starting with Arrow Lake and Lunar Lake) include new vectorised SHA512 instructions. Detect them and make them available to the rest of the system. Note the internal name "sha512ext". This is to disambiguate from other uses of "sha512". Sponsored-by: TrueNAS Reviewed-by: Tony Hutter <hutter2@llnl.gov> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Attila Fülöp <attila@fueloep.org> Signed-off-by: Rob Norris <rob.norris@truenas.com> Closes #18233
1 parent 6495daf commit 3547a35

File tree

4 files changed

+53
-1
lines changed

4 files changed

+53
-1
lines changed

config/toolchain-simd.m4

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_TOOLCHAIN_SIMD], [
2727
ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_MOVBE
2828
ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_VAES
2929
ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_VPCLMULQDQ
30+
ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_SHA512EXT
3031
ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVE
3132
ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVEOPT
3233
ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVES
@@ -491,6 +492,27 @@ AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_VPCLMULQDQ], [
491492
])
492493
])
493494

495+
dnl #
496+
dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_SHA512EXT
497+
dnl #
498+
AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_SHA512EXT], [
499+
AC_MSG_CHECKING([whether host toolchain supports SHA512])
500+
501+
AC_LINK_IFELSE([AC_LANG_SOURCE([
502+
[
503+
int main()
504+
{
505+
__asm__ __volatile__("vsha512msg2 %ymm5, %ymm6");
506+
return (0);
507+
}
508+
]])], [
509+
AC_MSG_RESULT([yes])
510+
AC_DEFINE([HAVE_SHA512EXT], 1, [Define if host toolchain supports SHA512])
511+
], [
512+
AC_MSG_RESULT([no])
513+
])
514+
])
515+
494516
dnl #
495517
dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVE
496518
dnl #

include/os/linux/kernel/linux/simd_x86.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
*/
2222
/*
2323
* Copyright (C) 2016 Gvozden Neskovic <neskovic@compeng.uni-frankfurt.de>.
24+
* Copyright (c) 2026, TrueNAS.
2425
*/
2526

2627
/*
@@ -623,6 +624,19 @@ zfs_vpclmulqdq_available(void)
623624
#endif
624625
}
625626

627+
/*
628+
* Check if SHA512 instructions are available
629+
*/
630+
static inline boolean_t
631+
zfs_sha512ext_available(void)
632+
{
633+
#if defined(X86_FEATURE_SHA512)
634+
return (!!boot_cpu_has(X86_FEATURE_SHA512));
635+
#else
636+
return (B_FALSE);
637+
#endif
638+
}
639+
626640
/*
627641
* Check if SHA_NI instruction set is available
628642
*/

lib/libspl/include/sys/simd.h

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
/*
2424
* Copyright (c) 2006 Sun Microsystems, Inc. All rights reserved.
2525
* Copyright (c) 2022 Tino Reichardt <milky-zfs@mcmilk.de>
26+
* Copyright (c) 2026, TrueNAS.
2627
*/
2728

2829
#ifndef _LIBSPL_SYS_SIMD_H
@@ -104,7 +105,8 @@ typedef enum cpuid_inst_sets {
104105
MOVBE,
105106
SHA_NI,
106107
VAES,
107-
VPCLMULQDQ
108+
VPCLMULQDQ,
109+
SHA512EXT,
108110
} cpuid_inst_sets_t;
109111

110112
/*
@@ -132,6 +134,7 @@ typedef struct cpuid_feature_desc {
132134
#define _VAES_BIT (1U << 9)
133135
#define _VPCLMULQDQ_BIT (1U << 10)
134136
#define _SHA_NI_BIT (1U << 29)
137+
#define _SHA512_BIT (1U << 0)
135138

136139
/*
137140
* Descriptions of supported instruction sets
@@ -163,6 +166,7 @@ static const cpuid_feature_desc_t cpuid_features[] = {
163166
[SHA_NI] = {7U, 0U, _SHA_NI_BIT, EBX },
164167
[VAES] = {7U, 0U, _VAES_BIT, ECX },
165168
[VPCLMULQDQ] = {7U, 0U, _VPCLMULQDQ_BIT, ECX },
169+
[SHA512EXT] = {7U, 1U, _SHA512_BIT, EAX },
166170
};
167171

168172
/*
@@ -239,6 +243,7 @@ CPUID_FEATURE_CHECK(movbe, MOVBE);
239243
CPUID_FEATURE_CHECK(shani, SHA_NI);
240244
CPUID_FEATURE_CHECK(vaes, VAES);
241245
CPUID_FEATURE_CHECK(vpclmulqdq, VPCLMULQDQ);
246+
CPUID_FEATURE_CHECK(sha512ext, SHA512EXT);
242247

243248
/*
244249
* Detect register set support
@@ -407,6 +412,15 @@ zfs_vpclmulqdq_available(void)
407412
return (__cpuid_has_vpclmulqdq());
408413
}
409414

415+
/*
416+
* Check if SHA512 instructions are available
417+
*/
418+
static inline boolean_t
419+
zfs_sha512ext_available(void)
420+
{
421+
return (__cpuid_has_sha512ext());
422+
}
423+
410424
/*
411425
* AVX-512 family of instruction sets:
412426
*

module/zcommon/simd_stat.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,8 @@ simd_stat_kstat_data(char *buf, size_t size, void *data)
122122
"vaes", zfs_vaes_available());
123123
off += SIMD_STAT_PRINT(simd_stat_kstat_payload,
124124
"vpclmulqdq", zfs_vpclmulqdq_available());
125+
off += SIMD_STAT_PRINT(simd_stat_kstat_payload,
126+
"sha512ext", zfs_sha512ext_available());
125127

126128
off += SIMD_STAT_PRINT(simd_stat_kstat_payload,
127129
"osxsave", boot_cpu_has(X86_FEATURE_OSXSAVE));

0 commit comments

Comments
 (0)