Skip to content

Commit

Permalink
Add generic implementation handling and new SHA2 impl
Browse files Browse the repository at this point in the history
The skeleton file module/icp/include/generic_impl.c can be used for
iterating over different implementations of algorithms. It's used by
SHA256, SHA512 and BLAKE3 currently.

The generic SHA2 implementation is based on public domain code of
ccpcrypto v0.10.

The assembly files are taken from current openssl master and are
licensed under the Apache License Version 2.0.

sha256-x86_64.S: x86-64, SSSE3, AVX, AVX2, SHA-NI
sha512-x86_64.S: x86-64,AVX, AVX2
sha256-armv7.S: ...
sha512-armv7.S: ...
sha256-armv8.S: NEON, ARMv8 Cryptography Extension
sha512-armv8.S: ARMv8 Cryptography Extension
sha256-ppc.S: generic PPC64 LE/BE
sha512-ppc.S: generic PPC64 LE/BE
sha256-p8.S: Power ISA Version 2.07 LE/BE
sha512-p8.S: Power ISA Version 2.07 LE/BE

Signed-off-by: Tino Reichardt <milky-zfs@mcmilk.de>
  • Loading branch information
mcmilk committed Sep 26, 2022
1 parent 756914d commit e4e5038
Show file tree
Hide file tree
Showing 44 changed files with 28,492 additions and 126 deletions.
6 changes: 5 additions & 1 deletion config/always-arch.m4
Expand Up @@ -22,6 +22,9 @@ AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_ARCH], [
aarch64*)
TARGET_CPU=aarch64
;;
armv*)
TARGET_CPU=arm
;;
sparc64)
TARGET_CPU=sparc64
;;
Expand All @@ -31,7 +34,8 @@ AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_ARCH], [
esac
AM_CONDITIONAL([TARGET_CPU_AARCH64], test $TARGET_CPU = aarch64)
AM_CONDITIONAL([TARGET_CPU_X86_64], test $TARGET_CPU = x86_64)
AM_CONDITIONAL([TARGET_CPU_X86_64], test $TARGET_CPU = x86_64)
AM_CONDITIONAL([TARGET_CPU_POWERPC], test $TARGET_CPU = powerpc)
AM_CONDITIONAL([TARGET_CPU_SPARC64], test $TARGET_CPU = sparc64)
AM_CONDITIONAL([TARGET_CPU_ARM], test $TARGET_CPU = arm)
])
2 changes: 2 additions & 0 deletions include/Makefile.am
Expand Up @@ -74,6 +74,7 @@ COMMON_H = \
sys/rrwlock.h \
sys/sa.h \
sys/sa_impl.h \
sys/sha2.h \
sys/skein.h \
sys/spa.h \
sys/spa_checkpoint.h \
Expand Down Expand Up @@ -123,6 +124,7 @@ COMMON_H = \
sys/zfs_delay.h \
sys/zfs_file.h \
sys/zfs_fuid.h \
sys/zfs_impl.h \
sys/zfs_project.h \
sys/zfs_quota.h \
sys/zfs_racct.h \
Expand Down
2 changes: 2 additions & 0 deletions include/os/freebsd/Makefile.am
Expand Up @@ -49,6 +49,8 @@ noinst_HEADERS = \
%D%/spl/sys/sid.h \
%D%/spl/sys/sig.h \
%D%/spl/sys/simd.h \
%D%/spl/sys/simd_aarch64.h \
%D%/spl/sys/simd_arm.h \
%D%/spl/sys/simd_powerpc.h \
%D%/spl/sys/simd_x86.h \
%D%/spl/sys/spl_condvar.h \
Expand Down
6 changes: 6 additions & 0 deletions include/os/freebsd/spl/sys/mod_os.h
Expand Up @@ -97,6 +97,12 @@
#define blake3_param_set_args(var) \
CTLTYPE_STRING, NULL, 0, blake3_param, "A"

#define sha256_param_set_args(var) \
CTLTYPE_STRING, NULL, 0, sha256_param, "A"

#define sha512_param_set_args(var) \
CTLTYPE_STRING, NULL, 0, sha512_param, "A"

#include <sys/kernel.h>
#define module_init(fn) \
static void \
Expand Down
6 changes: 6 additions & 0 deletions include/os/freebsd/spl/sys/simd.h
Expand Up @@ -32,6 +32,12 @@
#if defined(__amd64__) || defined(__i386__)
#include <sys/simd_x86.h>

#elif defined(__arm__)
#include <sys/simd_arm.h>

#elif defined(__aarch64__)
#include <sys/simd_aarch64.h>

#elif defined(__powerpc__)
#include <sys/simd_powerpc.h>

Expand Down
89 changes: 89 additions & 0 deletions include/os/freebsd/spl/sys/simd_aarch64.h
@@ -0,0 +1,89 @@
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or https://opensource.org/licenses/CDDL-1.0.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/

/*
* Copyright (C) 2022 Tino Reichardt <milky-zfs@mcmilk.de>
*/

/*
* USER API:
*
* Kernel fpu methods:
* kfpu_allowed()
* kfpu_begin()
* kfpu_end()
* kfpu_init()
* kfpu_fini()
*
* SIMD support:
*
* Following functions should be called to determine whether CPU feature
* is supported. All functions are usable in kernel and user space.
* If a SIMD algorithm is using more than one instruction set
* all relevant feature test functions should be called.
*
* Supported features:
* zfs_neon_available()
* zfs_sha256_available()
* zfs_sha512_available()
*/

#ifndef _FREEBSD_SIMD_AARCH64_H
#define _FREEBSD_SIMD_AARCH64_H

#include <sys/types.h>
#include <machine/elf.h>

#define kfpu_allowed() 1
#define kfpu_initialize(tsk) do {} while (0)
#define kfpu_begin() do {} while (0)
#define kfpu_end() do {} while (0)
#define kfpu_init() (0)
#define kfpu_fini() do {} while (0)

/*
* Check if NEON is available
*/
static inline boolean_t
zfs_neon_available(void)
{
return (elf_hwcap & HWCAP_FP);
}

/*
* Check if SHA256 is available
*/
static inline boolean_t
zfs_sha256_available(void)
{
return (elf_hwcap & HWCAP_SHA2);
}

/*
* Check if SHA512 is available
*/
static inline boolean_t
zfs_sha512_available(void)
{
return (elf_hwcap & HWCAP_SHA512);
}

#endif /* _FREEBSD_SIMD_AARCH64_H */
79 changes: 79 additions & 0 deletions include/os/freebsd/spl/sys/simd_arm.h
@@ -0,0 +1,79 @@
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or https://opensource.org/licenses/CDDL-1.0.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/

/*
* Copyright (C) 2022 Tino Reichardt <milky-zfs@mcmilk.de>
*/

/*
* USER API:
*
* Kernel fpu methods:
* kfpu_allowed()
* kfpu_begin()
* kfpu_end()
* kfpu_init()
* kfpu_fini()
*
* SIMD support:
*
* Following functions should be called to determine whether CPU feature
* is supported. All functions are usable in kernel and user space.
* If a SIMD algorithm is using more than one instruction set
* all relevant feature test functions should be called.
*
* Supported features:
* zfs_neon_available()
* zfs_sha256_available()
*/

#ifndef _FREEBSD_SIMD_ARM_H
#define _FREEBSD_SIMD_ARM_H

#include <sys/types.h>
#include <machine/elf.h>

#define kfpu_allowed() 1
#define kfpu_initialize(tsk) do {} while (0)
#define kfpu_begin() do {} while (0)
#define kfpu_end() do {} while (0)
#define kfpu_init() (0)
#define kfpu_fini() do {} while (0)

/*
* Check if NEON is available
*/
static inline boolean_t
zfs_neon_available(void)
{
return (elf_hwcap & HWCAP_NEON);
}

/*
* Check if SHA256 is available
*/
static inline boolean_t
zfs_sha256_available(void)
{
return (elf_hwcap2 & HWCAP2_SHA2);
}

#endif /* _FREEBSD_SIMD_ARM_H */
1 change: 1 addition & 0 deletions include/os/linux/Makefile.am
Expand Up @@ -10,6 +10,7 @@ kernel_linux_HEADERS = \
%D%/kernel/linux/percpu_compat.h \
%D%/kernel/linux/simd.h \
%D%/kernel/linux/simd_aarch64.h \
%D%/kernel/linux/simd_arm.h \
%D%/kernel/linux/simd_powerpc.h \
%D%/kernel/linux/simd_x86.h \
%D%/kernel/linux/utsname_compat.h \
Expand Down
5 changes: 4 additions & 1 deletion include/os/linux/kernel/linux/simd.h
Expand Up @@ -28,13 +28,16 @@
#if defined(__x86)
#include <linux/simd_x86.h>

#elif defined(__arm__)
#include <linux/simd_arm.h>

#elif defined(__aarch64__)
#include <linux/simd_aarch64.h>

#elif defined(__powerpc__)
#include <linux/simd_powerpc.h>
#else

#else
#define kfpu_allowed() 0
#define kfpu_begin() do {} while (0)
#define kfpu_end() do {} while (0)
Expand Down
51 changes: 44 additions & 7 deletions include/os/linux/kernel/linux/simd_aarch64.h
Expand Up @@ -18,8 +18,10 @@
*
* CDDL HEADER END
*/

/*
* Copyright (C) 2016 Romain Dolbeau <romain@dolbeau.org>.
* Copyright (C) 2022 Tino Reichardt <milky-zfs@mcmilk.de>
*/

/*
Expand All @@ -31,24 +33,59 @@
* kfpu_end()
* kfpu_init()
* kfpu_fini()
*
* SIMD support:
*
* Following functions should be called to determine whether CPU feature
* is supported. All functions are usable in kernel and user space.
* If a SIMD algorithm is using more than one instruction set
* all relevant feature test functions should be called.
*
* Supported features:
* zfs_neon_available()
* zfs_sha256_available()
* zfs_sha512_available()
*/

#ifndef _LINUX_SIMD_AARCH64_H
#define _LINUX_SIMD_AARCH64_H

#include <sys/isa_defs.h>

#if defined(__aarch64__)

#include <sys/types.h>
#include <asm/neon.h>
#include <asm/elf.h>
#include <asm/hwcap.h>

#define kfpu_allowed() 1
#define kfpu_begin() kernel_neon_begin()
#define kfpu_end() kernel_neon_end()
#define kfpu_init() 0
#define kfpu_fini() ((void) 0)
#define kfpu_init() (0)
#define kfpu_fini() do {} while (0)

/*
* Check if NEON is available
*/
static inline boolean_t
zfs_neon_available(void)
{
return (compat_elf_hwcap & HWCAP_FP);
}

#endif /* __aarch64__ */
/*
* Check if SHA256 is available
*/
static inline boolean_t
zfs_sha256_available(void)
{
return (compat_elf_hwcap & HWCAP_SHA2);
}

/*
* Check if SHA512 is available
*/
static inline boolean_t
zfs_sha512_available(void)
{
return (compat_elf_hwcap & HWCAP_SHA512);
}

#endif /* _LINUX_SIMD_AARCH64_H */

0 comments on commit e4e5038

Please sign in to comment.