1dnl # 2dnl # Handle differences in kernel FPU code. 3dnl # 4dnl # Kernel 5dnl # 5.19: The asm/fpu/internal.h header was removed, it has been 6dnl # effectively empty since the 5.16 kernel. 7dnl # 8dnl # 5.11: kernel_fpu_begin() is an inlined function now, so don't check 9dnl # for it inside the kernel symbols. 10dnl # 11dnl # 5.0: Wrappers have been introduced to save/restore the FPU state. 12dnl # This change was made to the 4.19.38 and 4.14.120 LTS kernels. 13dnl # HAVE_KERNEL_FPU_INTERNAL 14dnl # 15dnl # 4.2: Use __kernel_fpu_{begin,end}() 16dnl # HAVE_UNDERSCORE_KERNEL_FPU & KERNEL_EXPORTS_X86_FPU 17dnl # 18dnl # Pre-4.2: Use kernel_fpu_{begin,end}() 19dnl # HAVE_KERNEL_FPU & KERNEL_EXPORTS_X86_FPU 20dnl # 21dnl # N.B. The header check is performed before all other checks since it 22dnl # depends on HAVE_KERNEL_FPU_API_HEADER being set in confdefs.h. 23dnl # 24AC_DEFUN([ZFS_AC_KERNEL_FPU_HEADER], [ 25 AC_MSG_CHECKING([whether fpu headers are available]) 26 ZFS_LINUX_TRY_COMPILE([ 27 #include <linux/module.h> 28 #include <asm/fpu/api.h> 29 ],[ 30 ],[ 31 AC_DEFINE(HAVE_KERNEL_FPU_API_HEADER, 1, 32 [kernel has asm/fpu/api.h]) 33 34 ZFS_LINUX_TRY_COMPILE([ 35 #include <linux/module.h> 36 #include <asm/fpu/internal.h> 37 ],[ 38 ],[ 39 AC_DEFINE(HAVE_KERNEL_FPU_INTERNAL_HEADER, 1, 40 [kernel has asm/fpu/internal.h]) 41 AC_MSG_RESULT([asm/fpu/api.h asm/fpu/internal.h]) 42 ],[ 43 AC_MSG_RESULT([asm/fpu/api.h]) 44 ]) 45 ],[ 46 AC_MSG_RESULT([i387.h]) 47 ]) 48 49]) 50 51AC_DEFUN([ZFS_AC_KERNEL_SRC_FPU], [ 52 ZFS_LINUX_TEST_SRC([kernel_fpu], [ 53 #include <linux/types.h> 54 #ifdef HAVE_KERNEL_FPU_API_HEADER 55 #include <asm/fpu/api.h> 56 #ifdef HAVE_KERNEL_FPU_INTERNAL_HEADER 57 #include <asm/fpu/internal.h> 58 #endif 59 #else 60 #include <asm/i387.h> 61 #endif 62 ], [ 63 kernel_fpu_begin(); 64 kernel_fpu_end(); 65 ], [], [ZFS_META_LICENSE]) 66 67 ZFS_LINUX_TEST_SRC([__kernel_fpu], [ 68 #include <linux/types.h> 69 #ifdef HAVE_KERNEL_FPU_API_HEADER 70 #include <asm/fpu/api.h> 71 #ifdef HAVE_KERNEL_FPU_INTERNAL_HEADER 72 #include <asm/fpu/internal.h> 73 #endif 74 #else 75 #include <asm/i387.h> 76 #endif 77 ], [ 78 __kernel_fpu_begin(); 79 __kernel_fpu_end(); 80 ], [], [ZFS_META_LICENSE]) 81 82 ZFS_LINUX_TEST_SRC([kernel_neon], [ 83 #include <asm/neon.h> 84 ], [ 85 kernel_neon_begin(); 86 kernel_neon_end(); 87 ], [], [ZFS_META_LICENSE]) 88]) 89 90AC_DEFUN([ZFS_AC_KERNEL_FPU], [ 91 dnl # 92 dnl # Legacy kernel 93 dnl # 94 AC_MSG_CHECKING([whether kernel fpu is available]) 95 ZFS_LINUX_TEST_RESULT([kernel_fpu_license], [ 96 AC_MSG_RESULT(kernel_fpu_*) 97 AC_DEFINE(HAVE_KERNEL_FPU, 1, 98 [kernel has kernel_fpu_* functions]) 99 AC_DEFINE(KERNEL_EXPORTS_X86_FPU, 1, 100 [kernel exports FPU functions]) 101 ],[ 102 dnl # 103 dnl # Linux 4.2 kernel 104 dnl # 105 ZFS_LINUX_TEST_RESULT_SYMBOL([__kernel_fpu_license], 106 [__kernel_fpu_begin], 107 [arch/x86/kernel/fpu/core.c arch/x86/kernel/i387.c], [ 108 AC_MSG_RESULT(__kernel_fpu_*) 109 AC_DEFINE(HAVE_UNDERSCORE_KERNEL_FPU, 1, 110 [kernel has __kernel_fpu_* functions]) 111 AC_DEFINE(KERNEL_EXPORTS_X86_FPU, 1, 112 [kernel exports FPU functions]) 113 ],[ 114 dnl # 115 dnl # ARM neon symbols (only on arm and arm64) 116 dnl # could be GPL-only on arm64 after Linux 6.2 117 dnl # 118 ZFS_LINUX_TEST_RESULT([kernel_neon_license],[ 119 AC_MSG_RESULT(kernel_neon_*) 120 AC_DEFINE(HAVE_KERNEL_NEON, 1, 121 [kernel has kernel_neon_* functions]) 122 ],[ 123 # catch-all 124 AC_MSG_RESULT(internal) 125 AC_DEFINE(HAVE_KERNEL_FPU_INTERNAL, 1, 126 [kernel fpu internal]) 127 ]) 128 ]) 129 ]) 130]) 131