]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - share/man/man9/fpu_kern.9
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / share / man / man9 / fpu_kern.9
1 .\" Copyright (c) 2014
2 .\"     Konstantin Belousov <kib@FreeBSD.org>.  All rights reserved.
3 .\"
4 .\" Redistribution and use in source and binary forms, with or without
5 .\" modification, are permitted provided that the following conditions
6 .\" are met:
7 .\" 1. Redistributions of source code must retain the above copyright
8 .\"    notice, this list of conditions and the following disclaimer.
9 .\" 2. Redistributions in binary form must reproduce the above copyright
10 .\"    notice, this list of conditions and the following disclaimer in the
11 .\"    documentation and/or other materials provided with the distribution.
12 .\"
13 .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
14 .\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
15 .\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
16 .\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
17 .\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
18 .\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
19 .\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
20 .\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21 .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
22 .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23 .\"
24 .\" $FreeBSD$
25 .\"
26 .Dd June 23, 2014
27 .Dt FPU_KERN 9
28 .Os
29 .Sh NAME
30 .Nm fpu_kern
31 .Nd "facility to use the FPU in the kernel"
32 .Sh SYNOPSIS
33 .Ft struct fpu_kern_ctx *
34 .Fn fpu_kern_alloc_ctx "u_int flags"
35 .Ft void
36 .Fn fpu_kern_free_ctx "struct fpu_kern_ctx *ctx"
37 .Ft int
38 .Fn fpu_kern_enter "struct thread *td" "struct fpu_kern_ctx *ctx" "u_int flags"
39 .Ft int
40 .Fn fpu_kern_leave "struct thread *td" "struct fpu_kern_ctx *ctx"
41 .Ft int
42 .Fn fpu_kern_thread "u_int flags"
43 .Ft int
44 .Fn is_fpu_kern_thread "u_int flags"
45 .Sh DESCRIPTION
46 The
47 .Nm
48 family of functions allows the use of FPU hardware in kernel code.
49 Modern FPUs are not limited to providing hardware implementation for
50 floating point arithmetic; they offer advanced accelerators for cryptography
51 and other computational-intensive algorithms.
52 These facilities share registers with the FPU hardware.
53 .Pp
54 Typical kernel code does not need access to the FPU.
55 Saving a large register file on each entry to the kernel would waste
56 time.
57 When kernel code uses the FPU, the current FPU state must be saved to
58 avoid corrupting the user-mode state, and vice versa.
59 .Pp
60 The management of the save and restore is automatic.
61 The processor catches accesses to the FPU registers
62 when the non-current context tries to access them.
63 Explicit calls are required for the allocation of the save area and
64 the notification of the start and end of the code using the FPU.
65 .Pp
66 The
67 .Fn fpu_kern_alloc_ctx
68 function allocates the memory used by
69 .Nm
70 to track the use of the FPU hardware state and the related software state.
71 The
72 .Fn fpu_kern_alloc_ctx
73 function requires the
74 .Fa flags
75 argument, which currently accepts the following flags:
76 .Bl -tag -width ".Dv FPU_KERN_NOWAIT" -offset indent
77 .It Dv FPU_KERN_NOWAIT
78 Do not wait for the available memory if the request could not be satisfied
79 without sleep.
80 .It 0
81 No special handling is required.
82 .El
83 .Pp
84 The function returns the allocated context area, or
85 .Va NULL
86 if the allocation failed.
87 .Pp
88 The
89 .Fn fpu_kern_free_ctx
90 function frees the context previously allocated by
91 .Fn fpu_kern_alloc_ctx .
92 .Pp
93 The
94 .Fn fpu_kern_enter
95 function designates the start of the region of kernel code where the
96 use of the FPU is allowed.
97 Its arguments are:
98 .Bl -tag -width ".Fa ctx" -offset indent
99 .It Fa td
100 Currently must be
101 .Va curthread .
102 .It Fa ctx
103 The context save area previously allocated by
104 .Fn fpu_kern_alloc_ctx
105 and not currently in use by another call to
106 .Fn fpu_kern_enter .
107 .It Fa flags
108 This argument currently accepts the following flags:
109 .Bl -tag -width ".Dv FPU_KERN_NORMAL" -offset indent
110 .It Dv FPU_KERN_NORMAL
111 Indicates that the caller intends to access the full FPU state.
112 Must be specified currently.
113 .It Dv FPU_KERN_KTHR
114 Indicates that no saving of the current FPU state should be performed,
115 if the thread called
116 .Xr fpu_kern_thread 9
117 function.
118 This is intended to minimize code duplication in callers which
119 could be used from both kernel thread and syscall contexts.
120 The
121 .Fn fpu_kern_leave
122 function correctly handles such contexts.
123 .El
124 .El
125 .Pp
126 The function does not sleep or block.
127 It could cause the
128 .Nm Device Not Available
129 exception during execution, and on the first FPU access after the
130 function returns, as well as after each context switch
131 (see Intel Software Developer Manual for the reference).
132 Currently, no errors are defined which can be returned by
133 .Fn fpu_kern_enter
134 to the caller.
135 .Pp
136 The
137 .Fn fpu_kern_leave
138 function ends the region started by
139 .Fn fpu_kern_enter .
140 The uses of FPU in the kernel after the call to
141 .Fn fpu_kern_leave
142 are erronous until the next call to
143 .Fn fpu_kern_enter
144 is performed.
145 The function takes the
146 .Fa td
147 thread argument, which currently must be
148 .Va curthread ,
149 and the
150 .Fa ctx
151 context pointer, previously passed to
152 .Fn fpu_kern_enter .
153 After the function returns, the context may be freed or reused
154 by other invocation of
155 .Fn fpu_kern_enter .
156 There are no errors defined for the function, it always returns 0.
157 .Pp
158 The
159 .Fn fpu_kern_thread
160 function provides an optimization for threads which never leave to
161 the usermode.
162 Such thread can reuse the usermode save area for the FPU state,
163 which is allowed by the function call.
164 There is no flags defined for the function, and no error states
165 that the function returns.
166 .Pp
167 The
168 .Fn is_fpu_kern_thread
169 function returns the boolean indicating whether the current thread
170 entered the mode enabled by
171 .Fn fpu_kern_thread .
172 There is currently no flags defined for the function, the return
173 value is true if the current thread have the permanent FPU save area,
174 and false otherwise.
175 .Sh NOTES
176 The
177 .Nm
178 is currently implemented only for the i386 and amd64 architectures.
179 .Pp
180 There is no way to handle floating point exceptions raised from
181 kernel mode.
182 .Pp
183 The unused
184 .Fa flags
185 arguments
186 to the
187 .Nm
188 functions are to be extended to allow specification of the
189 set of the FPU hardware state used by the code region.
190 This would allow optimizations of saving and restoring the state.
191 .Sh AUTHORS
192 The
193 .Nm
194 facitily and this manual page were written by
195 .An Konstantin Belousov Aq Mt kib@FreeBSD.org .