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