| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- From df469cffe07c84906be43e89d33f2a8a5312e60f Mon Sep 17 00:00:00 2001
- From: Andi Kleen <[email protected]>
- Date: Fri, 13 Oct 2017 14:56:43 -0700
- Subject: [PATCH 067/242] x86/fpu: Parse clearcpuid= as early XSAVE argument
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- CVE-2017-5754
- With a followon patch we want to make clearcpuid affect the XSAVE
- configuration. But xsave is currently initialized before arguments
- are parsed. Move the clearcpuid= parsing into the special
- early xsave argument parsing code.
- Since clearcpuid= contains a = we need to keep the old __setup
- around as a dummy, otherwise it would end up as a environment
- variable in init's environment.
- Signed-off-by: Andi Kleen <[email protected]>
- Reviewed-by: Thomas Gleixner <[email protected]>
- Cc: Linus Torvalds <[email protected]>
- Cc: Peter Zijlstra <[email protected]>
- Link: http://lkml.kernel.org/r/[email protected]
- Signed-off-by: Ingo Molnar <[email protected]>
- (cherry picked from commit 0c2a3913d6f50503f7c59d83a6219e39508cc898)
- Signed-off-by: Andy Whitcroft <[email protected]>
- Signed-off-by: Kleber Sacilotto de Souza <[email protected]>
- (cherry picked from commit 27deb452eb0d27c406f3817ab057201aa8767abe)
- Signed-off-by: Fabian Grünbichler <[email protected]>
- ---
- arch/x86/kernel/cpu/common.c | 16 +++++++---------
- arch/x86/kernel/fpu/init.c | 11 +++++++++++
- 2 files changed, 18 insertions(+), 9 deletions(-)
- diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
- index 4be7b209a3d6..ef7b1ba56363 100644
- --- a/arch/x86/kernel/cpu/common.c
- +++ b/arch/x86/kernel/cpu/common.c
- @@ -1293,18 +1293,16 @@ void print_cpu_info(struct cpuinfo_x86 *c)
- pr_cont(")\n");
- }
-
- -static __init int setup_disablecpuid(char *arg)
- +/*
- + * clearcpuid= was already parsed in fpu__init_parse_early_param.
- + * But we need to keep a dummy __setup around otherwise it would
- + * show up as an environment variable for init.
- + */
- +static __init int setup_clearcpuid(char *arg)
- {
- - int bit;
- -
- - if (get_option(&arg, &bit) && bit >= 0 && bit < NCAPINTS * 32)
- - setup_clear_cpu_cap(bit);
- - else
- - return 0;
- -
- return 1;
- }
- -__setup("clearcpuid=", setup_disablecpuid);
- +__setup("clearcpuid=", setup_clearcpuid);
-
- #ifdef CONFIG_X86_64
- struct desc_ptr idt_descr __ro_after_init = {
- diff --git a/arch/x86/kernel/fpu/init.c b/arch/x86/kernel/fpu/init.c
- index d5d44c452624..07f0ab877f49 100644
- --- a/arch/x86/kernel/fpu/init.c
- +++ b/arch/x86/kernel/fpu/init.c
- @@ -249,6 +249,10 @@ static void __init fpu__init_system_ctx_switch(void)
- */
- static void __init fpu__init_parse_early_param(void)
- {
- + char arg[32];
- + char *argptr = arg;
- + int bit;
- +
- if (cmdline_find_option_bool(boot_command_line, "no387"))
- setup_clear_cpu_cap(X86_FEATURE_FPU);
-
- @@ -266,6 +270,13 @@ static void __init fpu__init_parse_early_param(void)
-
- if (cmdline_find_option_bool(boot_command_line, "noxsaves"))
- setup_clear_cpu_cap(X86_FEATURE_XSAVES);
- +
- + if (cmdline_find_option(boot_command_line, "clearcpuid", arg,
- + sizeof(arg)) &&
- + get_option(&argptr, &bit) &&
- + bit >= 0 &&
- + bit < NCAPINTS * 32)
- + setup_clear_cpu_cap(bit);
- }
-
- /*
- --
- 2.14.2
|