Commit 7680c27b authored by Cyrill Gorcunov's avatar Cyrill Gorcunov Committed by Andrei Vagin

x86: cpu -- Add ability to ignore xsaves

Currently even if kernel supports compact xsave frame a user
can disable it by passing noxsaves argument as a boot option.
Thus cpuid instruction will report its presence but in real
it gonna be masked from kernel pov. Lets do the same and
allow a user to mask it via --cpu-cap=noxsaves option
(valid for x86 only).
Reviewed-by: 's avatarDmitry Safonov <0x7f454c46@gmail.com>
Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@gmail.com>
Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
parent 18be1a83
...@@ -38,3 +38,8 @@ int cpuinfo_check(void) ...@@ -38,3 +38,8 @@ int cpuinfo_check(void)
{ {
return -ENOTSUP; return -ENOTSUP;
} }
int cpu_parse_option(const char *opt)
{
return -ENOTSUP;
}
...@@ -38,3 +38,8 @@ int cpuinfo_check(void) ...@@ -38,3 +38,8 @@ int cpuinfo_check(void)
{ {
return -ENOTSUP; return -ENOTSUP;
} }
int cpu_parse_option(const char *opt)
{
return -ENOTSUP;
}
...@@ -140,3 +140,8 @@ int cpuinfo_check(void) ...@@ -140,3 +140,8 @@ int cpuinfo_check(void)
return 0; return 0;
} }
int cpu_parse_option(const char *opt)
{
return -1;
}
...@@ -156,3 +156,8 @@ int cpuinfo_check(void) ...@@ -156,3 +156,8 @@ int cpuinfo_check(void)
return 1; return 1;
return 0; return 0;
} }
int cpu_parse_option(const char *opt)
{
return -1;
}
...@@ -416,3 +416,27 @@ int cpuinfo_check(void) ...@@ -416,3 +416,27 @@ int cpuinfo_check(void)
return 0; return 0;
} }
int cpu_parse_option(const char *opt)
{
static struct {
const char *name;
unsigned int feature;
} filters[] = {
{
.name = "noxsaves",
.feature = X86_FEATURE_XSAVES,
},
};
size_t i;
for (i = 0; i < ARRAY_SIZE(filters); i++) {
if (strncmp(opt, filters[i].name, strlen(filters[i].name)))
continue;
compel_cpu_clear_feature(filters[i].feature);
return strlen(filters[i].name);
}
return -1;
}
...@@ -150,6 +150,11 @@ static int parse_cpu_cap(struct cr_options *opts, const char *optarg) ...@@ -150,6 +150,11 @@ static int parse_cpu_cap(struct cr_options *opts, const char *optarg)
} else if (!strncmp(optarg, "ins", 3)) { } else if (!strncmp(optarg, "ins", 3)) {
____cpu_set_cap(opts, CPU_CAP_INS, inverse); ____cpu_set_cap(opts, CPU_CAP_INS, inverse);
optarg += 3; optarg += 3;
} else if (!strncmp(optarg, "op=", 3)) {
int pos = cpu_parse_option(&optarg[3]);
if (pos <= 0)
goto Esyntax;
optarg += pos + 3;
} else } else
goto Esyntax; goto Esyntax;
} }
......
...@@ -8,5 +8,6 @@ extern int cpu_dump_cpuinfo(void); ...@@ -8,5 +8,6 @@ extern int cpu_dump_cpuinfo(void);
extern int cpu_validate_cpuinfo(void); extern int cpu_validate_cpuinfo(void);
extern int cpuinfo_dump(void); extern int cpuinfo_dump(void);
extern int cpuinfo_check(void); extern int cpuinfo_check(void);
extern int cpu_parse_option(const char *opt);
#endif /* __CR_CPU_H__ */ #endif /* __CR_CPU_H__ */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment