1eda14cbcSMatt Macydnl # 2eda14cbcSMatt Macydnl # Handle differences in kernel FPU code. 3eda14cbcSMatt Macydnl # 4eda14cbcSMatt Macydnl # Kernel 5*681ce946SMartin Matuskadnl # 5.16: XCR code put into asm/fpu/xcr.h 6*681ce946SMartin Matuskadnl # HAVE_KERNEL_FPU_XCR_HEADER 7*681ce946SMartin Matuskadnl # 8eda14cbcSMatt Macydnl # 5.0: Wrappers have been introduced to save/restore the FPU state. 9eda14cbcSMatt Macydnl # This change was made to the 4.19.38 and 4.14.120 LTS kernels. 10eda14cbcSMatt Macydnl # HAVE_KERNEL_FPU_INTERNAL 11eda14cbcSMatt Macydnl # 12eda14cbcSMatt Macydnl # 4.2: Use __kernel_fpu_{begin,end}() 13eda14cbcSMatt Macydnl # HAVE_UNDERSCORE_KERNEL_FPU & KERNEL_EXPORTS_X86_FPU 14eda14cbcSMatt Macydnl # 15eda14cbcSMatt Macydnl # Pre-4.2: Use kernel_fpu_{begin,end}() 16eda14cbcSMatt Macydnl # HAVE_KERNEL_FPU & KERNEL_EXPORTS_X86_FPU 17eda14cbcSMatt Macydnl # 18eda14cbcSMatt Macydnl # N.B. The header check is performed before all other checks since it 19eda14cbcSMatt Macydnl # depends on HAVE_KERNEL_FPU_API_HEADER being set in confdefs.h. 20eda14cbcSMatt Macydnl # 21eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_FPU_HEADER], [ 22eda14cbcSMatt Macy AC_MSG_CHECKING([whether fpu headers are available]) 23eda14cbcSMatt Macy ZFS_LINUX_TRY_COMPILE([ 24eda14cbcSMatt Macy #include <linux/module.h> 25eda14cbcSMatt Macy #include <asm/fpu/api.h> 26eda14cbcSMatt Macy ],[ 27eda14cbcSMatt Macy ],[ 28eda14cbcSMatt Macy AC_DEFINE(HAVE_KERNEL_FPU_API_HEADER, 1, 29eda14cbcSMatt Macy [kernel has asm/fpu/api.h]) 30eda14cbcSMatt Macy AC_MSG_RESULT(asm/fpu/api.h) 31*681ce946SMartin Matuska AC_MSG_CHECKING([whether fpu/xcr header is available]) 32*681ce946SMartin Matuska ZFS_LINUX_TRY_COMPILE([ 33*681ce946SMartin Matuska #include <linux/module.h> 34*681ce946SMartin Matuska #include <asm/fpu/xcr.h> 35*681ce946SMartin Matuska ],[ 36*681ce946SMartin Matuska ],[ 37*681ce946SMartin Matuska AC_DEFINE(HAVE_KERNEL_FPU_XCR_HEADER, 1, 38*681ce946SMartin Matuska [kernel has asm/fpu/xcr.h]) 39*681ce946SMartin Matuska AC_MSG_RESULT(asm/fpu/xcr.h) 40*681ce946SMartin Matuska ],[ 41*681ce946SMartin Matuska AC_MSG_RESULT(no asm/fpu/xcr.h) 42*681ce946SMartin Matuska ]) 43eda14cbcSMatt Macy ],[ 44eda14cbcSMatt Macy AC_MSG_RESULT(i387.h & xcr.h) 45eda14cbcSMatt Macy ]) 46eda14cbcSMatt Macy]) 47eda14cbcSMatt Macy 48eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_SRC_FPU], [ 49eda14cbcSMatt Macy ZFS_LINUX_TEST_SRC([kernel_fpu], [ 50eda14cbcSMatt Macy #include <linux/types.h> 51eda14cbcSMatt Macy #ifdef HAVE_KERNEL_FPU_API_HEADER 52eda14cbcSMatt Macy #include <asm/fpu/api.h> 53eda14cbcSMatt Macy #else 54eda14cbcSMatt Macy #include <asm/i387.h> 55eda14cbcSMatt Macy #include <asm/xcr.h> 56eda14cbcSMatt Macy #endif 57eda14cbcSMatt Macy ], [ 58eda14cbcSMatt Macy kernel_fpu_begin(); 59eda14cbcSMatt Macy kernel_fpu_end(); 607877fdebSMatt Macy ], [], [ZFS_META_LICENSE]) 61eda14cbcSMatt Macy 62eda14cbcSMatt Macy ZFS_LINUX_TEST_SRC([__kernel_fpu], [ 63eda14cbcSMatt Macy #include <linux/types.h> 64eda14cbcSMatt Macy #ifdef HAVE_KERNEL_FPU_API_HEADER 65eda14cbcSMatt Macy #include <asm/fpu/api.h> 66eda14cbcSMatt Macy #else 67eda14cbcSMatt Macy #include <asm/i387.h> 68eda14cbcSMatt Macy #include <asm/xcr.h> 69eda14cbcSMatt Macy #endif 70eda14cbcSMatt Macy ], [ 71eda14cbcSMatt Macy __kernel_fpu_begin(); 72eda14cbcSMatt Macy __kernel_fpu_end(); 737877fdebSMatt Macy ], [], [ZFS_META_LICENSE]) 74eda14cbcSMatt Macy 75eda14cbcSMatt Macy ZFS_LINUX_TEST_SRC([fpu_internal], [ 76eda14cbcSMatt Macy #if defined(__x86_64) || defined(__x86_64__) || \ 77eda14cbcSMatt Macy defined(__i386) || defined(__i386__) 78eda14cbcSMatt Macy #if !defined(__x86) 79eda14cbcSMatt Macy #define __x86 80eda14cbcSMatt Macy #endif 81eda14cbcSMatt Macy #endif 82eda14cbcSMatt Macy 83eda14cbcSMatt Macy #if !defined(__x86) 84eda14cbcSMatt Macy #error Unsupported architecture 85eda14cbcSMatt Macy #endif 86eda14cbcSMatt Macy 87eda14cbcSMatt Macy #include <linux/types.h> 88eda14cbcSMatt Macy #ifdef HAVE_KERNEL_FPU_API_HEADER 89eda14cbcSMatt Macy #include <asm/fpu/api.h> 90eda14cbcSMatt Macy #include <asm/fpu/internal.h> 91eda14cbcSMatt Macy #else 92eda14cbcSMatt Macy #include <asm/i387.h> 93eda14cbcSMatt Macy #include <asm/xcr.h> 94eda14cbcSMatt Macy #endif 95eda14cbcSMatt Macy 96eda14cbcSMatt Macy #if !defined(XSTATE_XSAVE) 97eda14cbcSMatt Macy #error XSTATE_XSAVE not defined 98eda14cbcSMatt Macy #endif 99eda14cbcSMatt Macy 100eda14cbcSMatt Macy #if !defined(XSTATE_XRESTORE) 101eda14cbcSMatt Macy #error XSTATE_XRESTORE not defined 102eda14cbcSMatt Macy #endif 103eda14cbcSMatt Macy ],[ 104eda14cbcSMatt Macy struct fpu *fpu = ¤t->thread.fpu; 105eda14cbcSMatt Macy union fpregs_state *st = &fpu->state; 106eda14cbcSMatt Macy struct fregs_state *fr __attribute__ ((unused)) = &st->fsave; 107eda14cbcSMatt Macy struct fxregs_state *fxr __attribute__ ((unused)) = &st->fxsave; 108eda14cbcSMatt Macy struct xregs_state *xr __attribute__ ((unused)) = &st->xsave; 109eda14cbcSMatt Macy ]) 110eda14cbcSMatt Macy]) 111eda14cbcSMatt Macy 112eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_FPU], [ 113eda14cbcSMatt Macy dnl # 114eda14cbcSMatt Macy dnl # Legacy kernel 115eda14cbcSMatt Macy dnl # 116eda14cbcSMatt Macy AC_MSG_CHECKING([whether kernel fpu is available]) 117eda14cbcSMatt Macy ZFS_LINUX_TEST_RESULT_SYMBOL([kernel_fpu_license], 118eda14cbcSMatt Macy [kernel_fpu_begin], [arch/x86/kernel/fpu/core.c], [ 119eda14cbcSMatt Macy AC_MSG_RESULT(kernel_fpu_*) 120eda14cbcSMatt Macy AC_DEFINE(HAVE_KERNEL_FPU, 1, 121eda14cbcSMatt Macy [kernel has kernel_fpu_* functions]) 122eda14cbcSMatt Macy AC_DEFINE(KERNEL_EXPORTS_X86_FPU, 1, 123eda14cbcSMatt Macy [kernel exports FPU functions]) 124eda14cbcSMatt Macy ],[ 125eda14cbcSMatt Macy dnl # 126eda14cbcSMatt Macy dnl # Linux 4.2 kernel 127eda14cbcSMatt Macy dnl # 128eda14cbcSMatt Macy ZFS_LINUX_TEST_RESULT_SYMBOL([__kernel_fpu_license], 129eda14cbcSMatt Macy [__kernel_fpu_begin], 130eda14cbcSMatt Macy [arch/x86/kernel/fpu/core.c arch/x86/kernel/i387.c], [ 131eda14cbcSMatt Macy AC_MSG_RESULT(__kernel_fpu_*) 132eda14cbcSMatt Macy AC_DEFINE(HAVE_UNDERSCORE_KERNEL_FPU, 1, 133eda14cbcSMatt Macy [kernel has __kernel_fpu_* functions]) 134eda14cbcSMatt Macy AC_DEFINE(KERNEL_EXPORTS_X86_FPU, 1, 135eda14cbcSMatt Macy [kernel exports FPU functions]) 136eda14cbcSMatt Macy ],[ 137eda14cbcSMatt Macy ZFS_LINUX_TEST_RESULT([fpu_internal], [ 138eda14cbcSMatt Macy AC_MSG_RESULT(internal) 139eda14cbcSMatt Macy AC_DEFINE(HAVE_KERNEL_FPU_INTERNAL, 1, 140eda14cbcSMatt Macy [kernel fpu internal]) 141eda14cbcSMatt Macy ],[ 142eda14cbcSMatt Macy AC_MSG_RESULT(unavailable) 143eda14cbcSMatt Macy ]) 144eda14cbcSMatt Macy ]) 145eda14cbcSMatt Macy ]) 146eda14cbcSMatt Macy]) 147