Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/compat/linuxkpi/common/src/linux_fpu.c
39586 views
1
/*-
2
* SPDX-License-Identifier: BSD-2-Clause
3
*
4
* Copyright (c) 2020 Val Packett <[email protected]>
5
*
6
* Redistribution and use in source and binary forms, with or without
7
* modification, are permitted provided that the following conditions
8
* are met:
9
* 1. Redistributions of source code must retain the above copyright
10
* notice, this list of conditions and the following disclaimer.
11
* 2. Redistributions in binary form must reproduce the above copyright
12
* notice, this list of conditions and the following disclaimer in the
13
* documentation and/or other materials provided with the distribution.
14
*
15
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
16
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
19
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25
* SUCH DAMAGE.
26
*/
27
28
#include <sys/types.h>
29
#include <sys/param.h>
30
#include <sys/proc.h>
31
#include <sys/kernel.h>
32
33
#include <linux/compat.h>
34
#include <linux/sched.h>
35
36
#include <asm/fpu/api.h>
37
38
#if defined(__aarch64__) || defined(__arm__) || defined(__amd64__) || \
39
defined(__i386__) || defined(__powerpc64__)
40
41
#include <machine/fpu.h>
42
43
/*
44
* Technically the Linux API isn't supposed to allow nesting sections
45
* either, but currently used versions of GPU drivers rely on nesting
46
* working, so we only enter the section on the outermost level.
47
*/
48
49
void
50
lkpi_kernel_fpu_begin(void)
51
{
52
if ((current->fpu_ctx_level)++ == 0)
53
fpu_kern_enter(curthread, NULL, FPU_KERN_NOCTX);
54
}
55
56
void
57
lkpi_kernel_fpu_end(void)
58
{
59
if (--(current->fpu_ctx_level) == 0)
60
fpu_kern_leave(curthread, NULL);
61
}
62
63
void
64
lkpi_fpu_safe_exec(fpu_safe_exec_cb_t func, void *ctx)
65
{
66
unsigned int save_fpu_level;
67
68
save_fpu_level =
69
__current_unallocated(curthread) ? 0 : current->fpu_ctx_level;
70
if (__predict_false(save_fpu_level != 0)) {
71
current->fpu_ctx_level = 1;
72
kernel_fpu_end();
73
}
74
func(ctx);
75
if (__predict_false(save_fpu_level != 0)) {
76
kernel_fpu_begin();
77
current->fpu_ctx_level = save_fpu_level;
78
}
79
}
80
81
#else
82
83
void
84
lkpi_kernel_fpu_begin(void)
85
{
86
}
87
88
void
89
lkpi_kernel_fpu_end(void)
90
{
91
}
92
93
void
94
lkpi_fpu_safe_exec(fpu_safe_exec_cb_t func, void *ctx)
95
{
96
func(ctx);
97
}
98
99
#endif
100
101