1 .. SPDX-License-Identifier: GPL-2.0+ 2 3 Floating-point API 4 ================== 5 6 Kernel code is normally prohibited from using 7 instructions, including the C float and double 8 system call overhead, because the kernel does 9 userspace floating-point register state. 10 11 However, occasionally drivers or library funct 12 This is supported by isolating the functions c 13 translation unit (a separate source file), and 14 state around calls to those functions. This cr 15 floating-point usage. 16 17 The reason for this isolation is to prevent th 18 touching the FP registers outside these critic 19 use FP registers to optimize inlined ``memcpy` 20 floating-point registers may be wider than gen 21 22 Usability of floating-point code within the ke 23 Additionally, because a single kernel may be c 24 both with and without a floating-point unit, F 25 both at build time and at run time. 26 27 Several architectures implement the generic ke 28 ``linux/fpu.h``, as described below. Some othe 29 own unique APIs, which are documented separate 30 31 Build-time API 32 -------------- 33 34 Floating-point code may be built if the option 35 is enabled. For C code, such code must be plac 36 file must have its compilation flags adjusted 37 38 CFLAGS_foo.o += $(CC_FLAGS_FPU) 39 CFLAGS_REMOVE_foo.o += $(CC_FLAGS_NO_FPU) 40 41 Architectures are expected to define one or bo 42 top-level Makefile as needed. For example:: 43 44 CC_FLAGS_FPU := -mhard-float 45 46 or:: 47 48 CC_FLAGS_NO_FPU := -msoft-float 49 50 Normal kernel code is assumed to use the equiv 51 52 Runtime API 53 ----------- 54 55 The runtime API is provided in ``linux/fpu.h`` 56 from files implementing FP code (those with th 57 above). Instead, it must be included when defi 58 59 .. c:function:: bool kernel_fpu_available( voi 60 61 This function reports if floating-poin 62 platform. The value returned by this f 63 at runtime, so it only needs to be cal 64 critical section. 65 66 .. c:function:: void kernel_fpu_begin( void ) 67 void kernel_fpu_end( void ) 68 69 These functions create a floating-poin 70 valid to call ``kernel_fpu_begin()`` a 71 ``kernel_fpu_available()`` returned `` 72 guaranteed to be callable from (preemp 73 context. 74 75 Preemption may be disabled inside crit 76 should be minimized. They are *not* re 77 caller expects to nest critical sectio 78 reference counting.
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.