| dnl # |
| dnl # Handle differences in kernel FPU code. |
| dnl # |
| dnl # Kernel |
| 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 <linux/module.h> |
| #include <asm/fpu/api.h> |
| ],[ |
| ],[ |
| AC_DEFINE(HAVE_KERNEL_FPU_API_HEADER, 1, |
| [kernel has asm/fpu/api.h]) |
| AC_MSG_RESULT(asm/fpu/api.h) |
| ],[ |
| AC_MSG_RESULT(i387.h & xcr.h) |
| ]) |
| ]) |
| |
| AC_DEFUN([ZFS_AC_KERNEL_SRC_FPU], [ |
| ZFS_LINUX_TEST_SRC([kernel_fpu], [ |
| #include <linux/types.h> |
| #ifdef HAVE_KERNEL_FPU_API_HEADER |
| #include <asm/fpu/api.h> |
| #else |
| #include <asm/i387.h> |
| #include <asm/xcr.h> |
| #endif |
| ], [ |
| kernel_fpu_begin(); |
| kernel_fpu_end(); |
| ], [], [$ZFS_META_LICENSE]) |
| |
| ZFS_LINUX_TEST_SRC([__kernel_fpu], [ |
| #include <linux/types.h> |
| #ifdef HAVE_KERNEL_FPU_API_HEADER |
| #include <asm/fpu/api.h> |
| #else |
| #include <asm/i387.h> |
| #include <asm/xcr.h> |
| #endif |
| ], [ |
| __kernel_fpu_begin(); |
| __kernel_fpu_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 <linux/types.h> |
| #ifdef HAVE_KERNEL_FPU_API_HEADER |
| #include <asm/fpu/api.h> |
| #include <asm/fpu/internal.h> |
| #else |
| #include <asm/i387.h> |
| #include <asm/xcr.h> |
| #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; |
| ]) |
| ]) |
| |
| AC_DEFUN([ZFS_AC_KERNEL_FPU], [ |
| dnl # |
| dnl # Legacy kernel |
| dnl # |
| AC_MSG_CHECKING([whether kernel fpu is available]) |
| ZFS_LINUX_TEST_RESULT_SYMBOL([kernel_fpu_license], |
| [kernel_fpu_begin], [arch/x86/kernel/fpu/core.c], [ |
| 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]) |
| ],[ |
| AC_MSG_RESULT(unavailable) |
| ]) |
| ]) |
| ]) |
| ]) |