Branch data Line data Source code
1 : : #include <stdio.h>
2 : : #include <stdlib.h>
3 : : #include <unistd.h>
4 : : #include <errno.h>
5 : : #include <string.h>
6 : :
7 : : #include <sys/types.h>
8 : :
9 : : #include "compiler.h"
10 : : #include "types.h"
11 : : #include "log.h"
12 : : #include "util.h"
13 : : #include "bitops.h"
14 : :
15 : : #include "proc_parse.h"
16 : :
17 : : #include "fpu.h"
18 : : #include "cpu.h"
19 : :
20 : : #undef LOG_PREFIX
21 : : #define LOG_PREFIX "cpu: "
22 : :
23 : : const char * const x86_cap_flags[NCAPINTS_BITS] = {
24 : : [X86_FEATURE_FPU] = "fpu",
25 : : [X86_FEATURE_FXSR] = "fxsr",
26 : : [X86_FEATURE_XSAVE] = "xsave",
27 : : };
28 : :
29 : : static DECLARE_BITMAP(cpu_features, NCAPINTS_BITS);
30 : : #define cpu_has(bit) test_bit(bit, cpu_features)
31 : :
32 : 2184 : void cpu_set_feature(unsigned int feature)
33 : : {
34 [ + - ]: 2184 : if (likely(feature < NCAPINTS_BITS))
35 : 2184 : set_bit(feature, cpu_features);
36 : 2184 : }
37 : :
38 : 2667 : bool cpu_has_feature(unsigned int feature)
39 : : {
40 [ + - ]: 2667 : if (likely(feature < NCAPINTS_BITS))
41 : 2667 : return cpu_has(feature);
42 : : return false;
43 : : }
44 : :
45 : 546 : int cpu_init(void)
46 : : {
47 [ + - ]: 546 : if (parse_cpuinfo_features())
48 : : return -1;
49 : :
50 : : BUILD_BUG_ON(sizeof(struct xsave_struct) != XSAVE_SIZE);
51 : : BUILD_BUG_ON(sizeof(struct i387_fxsave_struct) != FXSAVE_SIZE);
52 : :
53 : : /*
54 : : * Make sure that at least FPU is onboard
55 : : * and fxsave is supported.
56 : : */
57 [ + - ]: 546 : if (cpu_has(X86_FEATURE_FPU)) {
58 [ - + ]: 546 : if (!cpu_has(X86_FEATURE_FXSR)) {
59 : 0 : pr_err("missing support fxsave/restore insns\n");
60 : 0 : return -1;
61 : : }
62 : : }
63 : :
64 : 546 : pr_debug("fpu:%d fxsr:%d xsave:%d\n",
65 : : !!cpu_has(X86_FEATURE_FPU),
66 : : !!cpu_has(X86_FEATURE_FXSR),
67 : : !!cpu_has(X86_FEATURE_XSAVE));
68 : :
69 : 546 : return 0;
70 : : }
|