xref: /freebsd/sys/contrib/openzfs/config/kernel-fpu.m4 (revision 681ce946f33e75c590e97c53076e86dff1fe8f4a)
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 = &current->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