diff --git a/config/kernel-fpu.m4 b/config/kernel-fpu.m4 index e79632bf9b0c..9961bf206667 100644 --- a/config/kernel-fpu.m4 +++ b/config/kernel-fpu.m4 @@ -1,204 +1,221 @@ dnl # dnl # Handle differences in kernel FPU code. dnl # dnl # Kernel dnl # 5.19: The asm/fpu/internal.h header was removed, it has been dnl # effectively empty since the 5.16 kernel. dnl # dnl # 5.16: XCR code put into asm/fpu/xcr.h dnl # HAVE_KERNEL_FPU_XCR_HEADER dnl # dnl # XSTATE_XSAVE and XSTATE_XRESTORE aren't accessible any more dnl # HAVE_KERNEL_FPU_XSAVE_INTERNAL dnl # dnl # 5.11: kernel_fpu_begin() is an inlined function now, so don't check dnl # for it inside the kernel symbols. dnl # dnl # 5.0: Wrappers have been introduced to save/restore the FPU state. dnl # This change was made to the 4.19.38 and 4.14.120 LTS kernels. dnl # HAVE_KERNEL_FPU_INTERNAL dnl # dnl # 4.2: Use __kernel_fpu_{begin,end}() dnl # HAVE_UNDERSCORE_KERNEL_FPU & KERNEL_EXPORTS_X86_FPU dnl # dnl # Pre-4.2: Use kernel_fpu_{begin,end}() dnl # HAVE_KERNEL_FPU & KERNEL_EXPORTS_X86_FPU dnl # dnl # N.B. The header check is performed before all other checks since it dnl # depends on HAVE_KERNEL_FPU_API_HEADER being set in confdefs.h. dnl # AC_DEFUN([ZFS_AC_KERNEL_FPU_HEADER], [ AC_MSG_CHECKING([whether fpu headers are available]) ZFS_LINUX_TRY_COMPILE([ #include #include ],[ ],[ AC_DEFINE(HAVE_KERNEL_FPU_API_HEADER, 1, [kernel has asm/fpu/api.h]) fpu_headers="asm/fpu/api.h" ZFS_LINUX_TRY_COMPILE([ #include #include ],[ ],[ AC_DEFINE(HAVE_KERNEL_FPU_XCR_HEADER, 1, [kernel has asm/fpu/xcr.h]) fpu_headers="$fpu_headers asm/fpu/xcr.h" ]) ZFS_LINUX_TRY_COMPILE([ #include #include ],[ ],[ AC_DEFINE(HAVE_KERNEL_FPU_INTERNAL_HEADER, 1, [kernel has asm/fpu/internal.h]) fpu_headers="$fpu_headers asm/fpu/internal.h" ]) AC_MSG_RESULT([$fpu_headers]) ],[ AC_MSG_RESULT([i387.h & xcr.h]) ]) ]) AC_DEFUN([ZFS_AC_KERNEL_SRC_FPU], [ ZFS_LINUX_TEST_SRC([kernel_fpu], [ #include #ifdef HAVE_KERNEL_FPU_API_HEADER #include #else #include #include #endif ], [ kernel_fpu_begin(); kernel_fpu_end(); ], [], [ZFS_META_LICENSE]) ZFS_LINUX_TEST_SRC([__kernel_fpu], [ #include #ifdef HAVE_KERNEL_FPU_API_HEADER #include #else #include #include #endif ], [ __kernel_fpu_begin(); __kernel_fpu_end(); ], [], [ZFS_META_LICENSE]) + ZFS_LINUX_TEST_SRC([kernel_neon], [ + #include + ], [ + kernel_neon_begin(); + kernel_neon_end(); + ], [], [ZFS_META_LICENSE]) + ZFS_LINUX_TEST_SRC([fpu_internal], [ #if defined(__x86_64) || defined(__x86_64__) || \ defined(__i386) || defined(__i386__) #if !defined(__x86) #define __x86 #endif #endif #if !defined(__x86) #error Unsupported architecture #endif #include #ifdef HAVE_KERNEL_FPU_API_HEADER #include #ifdef HAVE_KERNEL_FPU_INTERNAL_HEADER #include #endif #else #include #include #endif #if !defined(XSTATE_XSAVE) #error XSTATE_XSAVE not defined #endif #if !defined(XSTATE_XRESTORE) #error XSTATE_XRESTORE not defined #endif ],[ struct fpu *fpu = ¤t->thread.fpu; union fpregs_state *st = &fpu->state; struct fregs_state *fr __attribute__ ((unused)) = &st->fsave; struct fxregs_state *fxr __attribute__ ((unused)) = &st->fxsave; struct xregs_state *xr __attribute__ ((unused)) = &st->xsave; ]) ZFS_LINUX_TEST_SRC([fpu_xsave_internal], [ #include #if defined(__x86_64) || defined(__x86_64__) || \ defined(__i386) || defined(__i386__) #if !defined(__x86) #define __x86 #endif #endif #if !defined(__x86) #error Unsupported architecture #endif #include #ifdef HAVE_KERNEL_FPU_API_HEADER #include #ifdef HAVE_KERNEL_FPU_INTERNAL_HEADER #include #endif #else #include #include #endif ],[ struct fpu *fpu = ¤t->thread.fpu; union fpregs_state *st = &fpu->fpstate->regs; struct fregs_state *fr __attribute__ ((unused)) = &st->fsave; struct fxregs_state *fxr __attribute__ ((unused)) = &st->fxsave; struct xregs_state *xr __attribute__ ((unused)) = &st->xsave; ]) ]) AC_DEFUN([ZFS_AC_KERNEL_FPU], [ dnl # dnl # Legacy kernel dnl # AC_MSG_CHECKING([whether kernel fpu is available]) ZFS_LINUX_TEST_RESULT([kernel_fpu_license], [ AC_MSG_RESULT(kernel_fpu_*) AC_DEFINE(HAVE_KERNEL_FPU, 1, [kernel has kernel_fpu_* functions]) AC_DEFINE(KERNEL_EXPORTS_X86_FPU, 1, [kernel exports FPU functions]) ],[ dnl # dnl # Linux 4.2 kernel dnl # ZFS_LINUX_TEST_RESULT_SYMBOL([__kernel_fpu_license], [__kernel_fpu_begin], [arch/x86/kernel/fpu/core.c arch/x86/kernel/i387.c], [ AC_MSG_RESULT(__kernel_fpu_*) AC_DEFINE(HAVE_UNDERSCORE_KERNEL_FPU, 1, [kernel has __kernel_fpu_* functions]) AC_DEFINE(KERNEL_EXPORTS_X86_FPU, 1, [kernel exports FPU functions]) ],[ - ZFS_LINUX_TEST_RESULT([fpu_internal], [ - AC_MSG_RESULT(internal) - AC_DEFINE(HAVE_KERNEL_FPU_INTERNAL, 1, - [kernel fpu internal]) + dnl # + dnl # ARM neon symbols (only on arm and arm64) + dnl # could be GPL-only on arm64 after Linux 6.2 + dnl # + ZFS_LINUX_TEST_RESULT([kernel_neon_license],[ + AC_MSG_RESULT(kernel_neon_*) + AC_DEFINE(HAVE_KERNEL_NEON, 1, + [kernel has kernel_neon_* functions]) ],[ - ZFS_LINUX_TEST_RESULT([fpu_xsave_internal], [ - AC_MSG_RESULT(internal with internal XSAVE) - AC_DEFINE(HAVE_KERNEL_FPU_XSAVE_INTERNAL, 1, - [kernel fpu and XSAVE internal]) - ],[ - AC_MSG_RESULT(unavailable) - ]) + ZFS_LINUX_TEST_RESULT([fpu_internal], [ + AC_MSG_RESULT(internal) + AC_DEFINE(HAVE_KERNEL_FPU_INTERNAL, 1, + [kernel fpu internal]) + ],[ + ZFS_LINUX_TEST_RESULT([fpu_xsave_internal], [ + AC_MSG_RESULT(internal with internal XSAVE) + AC_DEFINE(HAVE_KERNEL_FPU_XSAVE_INTERNAL, 1, + [kernel fpu and XSAVE internal]) + ],[ + AC_MSG_RESULT(unavailable) + ]) + ]) ]) ]) ]) ]) diff --git a/include/os/linux/kernel/linux/simd_aarch64.h b/include/os/linux/kernel/linux/simd_aarch64.h index 50937e97ced1..cd1a78240016 100644 --- a/include/os/linux/kernel/linux/simd_aarch64.h +++ b/include/os/linux/kernel/linux/simd_aarch64.h @@ -1,54 +1,60 @@ /* * 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 http://www.opensolaris.org/os/licensing. * 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) 2016 Romain Dolbeau . */ /* * USER API: * * Kernel fpu methods: * kfpu_allowed() * kfpu_begin() * kfpu_end() * kfpu_init() * kfpu_fini() */ #ifndef _LINUX_SIMD_AARCH64_H #define _LINUX_SIMD_AARCH64_H #include #if defined(__aarch64__) #include #include +#if (defined(HAVE_KERNEL_NEON) && defined(CONFIG_KERNEL_MODE_NEON)) #define kfpu_allowed() 1 #define kfpu_begin() kernel_neon_begin() #define kfpu_end() kernel_neon_end() +#else +#define kfpu_allowed() 0 +#define kfpu_begin() do {} while (0) +#define kfpu_end() do {} while (0) +#endif #define kfpu_init() 0 #define kfpu_fini() ((void) 0) #endif /* __aarch64__ */ #endif /* _LINUX_SIMD_AARCH64_H */