xref: /illumos-gate/usr/src/uts/common/sys/kfpu.h (revision 2fc9ab6e)
1*2fc9ab6eSJerry Jelinek /*
2*2fc9ab6eSJerry Jelinek  * This file and its contents are supplied under the terms of the
3*2fc9ab6eSJerry Jelinek  * Common Development and Distribution License ("CDDL"), version 1.0.
4*2fc9ab6eSJerry Jelinek  * You may only use this file in accordance with the terms of version
5*2fc9ab6eSJerry Jelinek  * 1.0 of the CDDL.
6*2fc9ab6eSJerry Jelinek  *
7*2fc9ab6eSJerry Jelinek  * A full copy of the text of the CDDL should have accompanied this
8*2fc9ab6eSJerry Jelinek  * source.  A copy of the CDDL is also available via the Internet at
9*2fc9ab6eSJerry Jelinek  * http://www.illumos.org/license/CDDL.
10*2fc9ab6eSJerry Jelinek  */
11*2fc9ab6eSJerry Jelinek 
12*2fc9ab6eSJerry Jelinek /*
13*2fc9ab6eSJerry Jelinek  * Copyright 2020 Joyent, Inc.
14*2fc9ab6eSJerry Jelinek  */
15*2fc9ab6eSJerry Jelinek 
16*2fc9ab6eSJerry Jelinek #ifndef _SYS_KFPU_H
17*2fc9ab6eSJerry Jelinek #define	_SYS_KFPU_H
18*2fc9ab6eSJerry Jelinek 
19*2fc9ab6eSJerry Jelinek /*
20*2fc9ab6eSJerry Jelinek  * This header file provides a means for the kernel to opt into using the FPU.
21*2fc9ab6eSJerry Jelinek  * Care should be exercised when using the FPU.
22*2fc9ab6eSJerry Jelinek  */
23*2fc9ab6eSJerry Jelinek 
24*2fc9ab6eSJerry Jelinek #include <sys/types.h>
25*2fc9ab6eSJerry Jelinek 
26*2fc9ab6eSJerry Jelinek #ifdef __cplusplus
27*2fc9ab6eSJerry Jelinek extern "C" {
28*2fc9ab6eSJerry Jelinek #endif
29*2fc9ab6eSJerry Jelinek 
30*2fc9ab6eSJerry Jelinek typedef struct kfpu_state kfpu_state_t;
31*2fc9ab6eSJerry Jelinek 
32*2fc9ab6eSJerry Jelinek /*
33*2fc9ab6eSJerry Jelinek  * Allocate a new kernel FPU state. This may be allocated at a time independent
34*2fc9ab6eSJerry Jelinek  * from its use. It will stay around until such a time as kernel_fpu_free() is
35*2fc9ab6eSJerry Jelinek  * called. A given kernel FPU state may only be used by a single thread at any
36*2fc9ab6eSJerry Jelinek  * time; however, it is not bound to a given thread.
37*2fc9ab6eSJerry Jelinek  */
38*2fc9ab6eSJerry Jelinek extern kfpu_state_t *kernel_fpu_alloc(int);
39*2fc9ab6eSJerry Jelinek extern void kernel_fpu_free(kfpu_state_t *);
40*2fc9ab6eSJerry Jelinek 
41*2fc9ab6eSJerry Jelinek /*
42*2fc9ab6eSJerry Jelinek  * These functions begin and end the use of the kernel FPU. Once this is called,
43*2fc9ab6eSJerry Jelinek  * a given kernel thread will be allowed to use the FPU. This will be saved and
44*2fc9ab6eSJerry Jelinek  * restored across context switches.
45*2fc9ab6eSJerry Jelinek  */
46*2fc9ab6eSJerry Jelinek extern void kernel_fpu_begin(kfpu_state_t *, uint_t);
47*2fc9ab6eSJerry Jelinek extern void kernel_fpu_end(kfpu_state_t *, uint_t);
48*2fc9ab6eSJerry Jelinek 
49*2fc9ab6eSJerry Jelinek /*
50*2fc9ab6eSJerry Jelinek  * Internal validation function.
51*2fc9ab6eSJerry Jelinek  */
52*2fc9ab6eSJerry Jelinek extern void kernel_fpu_no_swtch(void);
53*2fc9ab6eSJerry Jelinek 
54*2fc9ab6eSJerry Jelinek /*
55*2fc9ab6eSJerry Jelinek  * Flag definitions for kernel_fpu_begin and kernel_fpu_end.
56*2fc9ab6eSJerry Jelinek  */
57*2fc9ab6eSJerry Jelinek #define	KFPU_NO_STATE	0x01	/* kfpu_state_t not passed; use preemption */
58*2fc9ab6eSJerry Jelinek #define	KFPU_USE_LWP	0x02	/* kfpu_state_t not passed; use lwp */
59*2fc9ab6eSJerry Jelinek 
60*2fc9ab6eSJerry Jelinek #ifdef __cplusplus
61*2fc9ab6eSJerry Jelinek }
62*2fc9ab6eSJerry Jelinek #endif
63*2fc9ab6eSJerry Jelinek 
64*2fc9ab6eSJerry Jelinek #endif /* _SYS_KFPU_H */
65