Provided by: freebsd-manpages_11.1-3_all bug

NAME

       fpu_kern — facility to use the FPU in the kernel

SYNOPSIS

       struct fpu_kern_ctx *
       fpu_kern_alloc_ctx(u_int flags);

       void
       fpu_kern_free_ctx(struct fpu_kern_ctx *ctx);

       int
       fpu_kern_enter(struct thread *td, struct fpu_kern_ctx *ctx, u_int flags);

       int
       fpu_kern_leave(struct thread *td, struct fpu_kern_ctx *ctx);

       int
       fpu_kern_thread(u_int flags);

       int
       is_fpu_kern_thread(u_int flags);

DESCRIPTION

       The  fpu_kern  family  of  functions  allows the use of FPU hardware in kernel code.  Modern FPUs are not
       limited to  providing  hardware  implementation  for  floating  point  arithmetic;  they  offer  advanced
       accelerators  for  cryptography  and  other  computational-intensive  algorithms.  These facilities share
       registers with the FPU hardware.

       Typical kernel code does not need access to the FPU.  Saving a large register file on each entry  to  the
       kernel  would  waste  time.   When kernel code uses the FPU, the current FPU state must be saved to avoid
       corrupting the user-mode state, and vice versa.

       The management of the save and restore is automatic.  The processor catches accesses to the FPU registers
       when the non-current context tries to access them.  Explicit calls are required for the allocation of the
       save area and the notification of the start and end of the code using the FPU.

       The fpu_kern_alloc_ctx() function allocates the memory used by fpu_kern to  track  the  use  of  the  FPU
       hardware  state  and  the  related  software state.  The fpu_kern_alloc_ctx() function requires the flags
       argument, which currently accepts the following flags:

             FPU_KERN_NOWAIT  Do not wait for the available memory if the request could not be satisfied without
                              sleep.

             0                No special handling is required.

       The function returns the allocated context area, or NULL if the allocation failed.

       The fpu_kern_free_ctx() function frees the context previously allocated by fpu_kern_alloc_ctx().

       The fpu_kern_enter() function designates the start of the region of kernel code where the use of the  FPU
       is allowed.  Its arguments are:

             td   Currently must be curthread.

             ctx  The context save area previously allocated by fpu_kern_alloc_ctx() and not currently in use by
                  another call to fpu_kern_enter().

             flags
                  This argument currently accepts the following flags:

                        FPU_KERN_NORMAL  Indicates  that  the caller intends to access the full FPU state.  Must
                                         be specified currently.

                        FPU_KERN_KTHR    Indicates that no saving of the current FPU state should be  performed,
                                         if  the thread called fpu_kern_thread(9) function.  This is intended to
                                         minimize code duplication in callers which  could  be  used  from  both
                                         kernel  thread  and  syscall  contexts.   The fpu_kern_leave() function
                                         correctly handles such contexts.

                        FPU_KERN_NOCTX   Avoid nesting save area.  If the flag is specified,  the  ctx  must  be
                                         passed  as  NULL.   The  flag should only be used for really short code
                                         blocks which can be executed in a critical section.  It avoids the need
                                         to allocate the FPU context by the cost of increased system latency.

       The function does not sleep or  block.   It  could  cause  the  Device  Not  Available  exception  during
       execution,  and  on the first FPU access after the function returns, as well as after each context switch
       (see Intel Software Developer Manual for the reference).  Currently, no errors are defined which  can  be
       returned by fpu_kern_enter() to the caller.

       The fpu_kern_leave() function ends the region started by fpu_kern_enter().  The uses of FPU in the kernel
       after  the  call  to fpu_kern_leave() are erroneous until the next call to fpu_kern_enter() is performed.
       The function takes the td thread argument, which  currently  must  be  curthread,  and  the  ctx  context
       pointer,  previously passed to fpu_kern_enter().  After the function returns, the context may be freed or
       reused by other invocation of fpu_kern_enter().  There are no errors defined for the function, it  always
       returns 0.

       The  fpu_kern_thread()  function  enables  an optimization for threads which never leave to the usermode.
       The current thread will reuse the usermode save area for the kernel FPU state  instead  of  requiring  an
       explicitly  allocated context.  There are no flags defined for the function, and no error states that the
       function returns.  Once this function has been called, neither fpu_kern_enter() nor  fpu_kern_leave()  is
       required to be called and the fpu is available for use in the calling thread.

       The  is_fpu_kern_thread()  function returns the boolean indicating whether the current thread entered the
       mode enabled by fpu_kern_thread().  There is currently no flags defined  for  the  function,  the  return
       value is true if the current thread have the permanent FPU save area, and false otherwise.

NOTES

       The fpu_kern is currently implemented only for the i386 and amd64 architectures.

       There is no way to handle floating point exceptions raised from kernel mode.

       The unused flags arguments to the fpu_kern functions are to be extended to allow specification of the set
       of  the  FPU  hardware  state  used  by  the  code  region.  This would allow optimizations of saving and
       restoring the state.

AUTHORS

       The fpu_kern facitily and this manual page were written by Konstantin Belousov <kib@FreeBSD.org>.

Debian                                          October 23, 2014                                     FPU_KERN(9)