All of lore.kernel.org
 help / color / mirror / Atom feed
From: Prarit Bhargava <prarit@redhat.com>
To: linux-kernel@vger.kernel.org
Cc: Prarit Bhargava <prarit@redhat.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
	"H. Peter Anvin" <hpa@zytor.com>, Andi Kleen <ak@linux.intel.com>,
	x86@kernel.org, linux-doc@vger.kernel.org
Subject: [PATCH] x86/fpu: Parse comma separated list passed in clearcpuid
Date: Thu, 21 Feb 2019 08:12:25 -0500	[thread overview]
Message-ID: <20190221131225.22063-1-prarit@redhat.com> (raw)

Users cannot disable multiple CPU features with the kernel parameter
clearcpuid=.  For example, "clearcpuid=154 clearcpuid=227" only disables
CPUID bit 154.

Previous to commit 0c2a3913d6f5 ("x86/fpu: Parse clearcpuid= as early XSAVE
argument") it was possible to pass multiple clearcpuid options as kernel
parameters using individual entries.  With the new code it isn't easy to
replicate exactly that behaviour but a comma separated list can be easily
implemented, eg) "clearcpuid=154,227"

Make the clearcpuid parse a comma-separated list of values instead of only
a single value.

Signed-off-by: Prarit Bhargava <prarit@redhat.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: x86@kernel.org
Cc: linux-doc@vger.kernel.org
---
 .../admin-guide/kernel-parameters.txt         | 10 ++++----
 arch/x86/kernel/fpu/init.c                    | 25 ++++++++++++++-----
 2 files changed, 24 insertions(+), 11 deletions(-)

diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index 858b6c0b9a15..0084fb0a0781 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -559,11 +559,11 @@
 			systems.
 
 	clearcpuid=BITNUM [X86]
-			Disable CPUID feature X for the kernel. See
-			arch/x86/include/asm/cpufeatures.h for the valid bit
-			numbers. Note the Linux specific bits are not necessarily
-			stable over kernel options, but the vendor specific
-			ones should be.
+			Disable the comma-separated list of CPUID features for
+			the kernel. See arch/x86/include/asm/cpufeatures.h for
+			the valid bit numbers. Note the Linux specific bits
+			are not necessarily stable over kernel options, but
+			the vendor specific ones should be.
 			Also note that user programs calling CPUID directly
 			or using the feature without checking anything
 			will still see it. This just prevents it from
diff --git a/arch/x86/kernel/fpu/init.c b/arch/x86/kernel/fpu/init.c
index 6abd83572b01..14bb3ab769d2 100644
--- a/arch/x86/kernel/fpu/init.c
+++ b/arch/x86/kernel/fpu/init.c
@@ -251,7 +251,8 @@ static void __init fpu__init_parse_early_param(void)
 {
 	char arg[32];
 	char *argptr = arg;
-	int bit;
+	char *argptrend;
+	int bit, i, ret;
 
 	if (cmdline_find_option_bool(boot_command_line, "no387"))
 		setup_clear_cpu_cap(X86_FEATURE_FPU);
@@ -272,11 +273,23 @@ static void __init fpu__init_parse_early_param(void)
 		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);
+				sizeof(arg))) {
+		argptrend = argptr + strlen(argptr) - 1;
+		for (i = 0; i < (argptrend - argptr); i++)
+			if (arg[i] == ',')
+				arg[i] = '\0';
+		while (argptr < argptrend) {
+			ret = kstrtoint(argptr, 10, &bit);
+			if (!ret && (bit >= 0 && bit < NCAPINTS * 32))
+				setup_clear_cpu_cap(bit);
+			else {
+				pr_warn("x86/fpu: clearcpuid invalid entry %s\n",
+					arg);
+				return;
+			}
+			argptr += strlen(argptr) + 1;
+		}
+	}
 }
 
 /*
-- 
2.17.2


             reply	other threads:[~2019-02-21 13:12 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-02-21 13:12 Prarit Bhargava [this message]
2019-02-21 13:37 ` [PATCH] x86/fpu: Parse comma separated list passed in clearcpuid Peter Zijlstra
2019-02-21 18:58   ` Andi Kleen
2019-02-21 19:01     ` Prarit Bhargava
2019-02-21 13:48 ` Peter Zijlstra
2019-02-27 23:48   ` Prarit Bhargava

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190221131225.22063-1-prarit@redhat.com \
    --to=prarit@redhat.com \
    --cc=ak@linux.intel.com \
    --cc=bp@alien8.de \
    --cc=hpa@zytor.com \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=tglx@linutronix.de \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.