Received: by 2002:ac0:aed5:0:0:0:0:0 with SMTP id t21csp910173imb; Fri, 1 Mar 2019 18:55:19 -0800 (PST) X-Google-Smtp-Source: APXvYqyBtUYbYQtVJbDBR1Dj5q5zZ4MUJcKhyVbu5X8h9oWFnRL3XmmwvzeZ5yUJv+yk74NUvyiC X-Received: by 2002:a63:1960:: with SMTP id 32mr7993146pgz.171.1551495319339; Fri, 01 Mar 2019 18:55:19 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1551495319; cv=none; d=google.com; s=arc-20160816; b=be9h1U+GcwOTvAhPfI9MwbgaICicQVQ/PRjLOw9XBBvH+H6uwaMFZ/jUzwJARbgj18 8l+4KJ42qTO8UBGKTJyN9kc7XwSFKtxOXp1UeKGCXS4GQQbOKH+eXNKHpk8zTOrph0Rx 25k0PwRuEuOhNJaoCw4UJhOYm3rtEJgP1fDWHI00ObNtAsEaeJ4m3IXK6Oq61T/IcdH2 ccZrYdN4Bb6I9CfjyQPVFwscBay+GixrviuTUaA+OCBXVk+zDcbG0kirhBv1g3EWFeIO MNxwt5/CUDk5Bf/vgapY6zBcHxy5HWTwvVlAVIC0+ipKRBHCRqJ0uAJ75SfIKM+BdQUX k1mQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=KpWaLXy88xsaEptR32w2fktrIdiPP0ynKvPGn96CXNk=; b=0Ke3vZIiOeAdlWJTaqM9UuF1py/WqjSmlMgSiHqAIUqCMzflUqWhuDQyCFxGULMu22 cXTq8IgNI5b5cWlghQCbYEX7cL8ww55Yczt2YdJUlDoJH9EbIqC54AD73/+CUHN17VE3 EM5WNkpWL9qF7bH3DGR43Cr13giNpO+locFVKd5EFKfvjupJd+OwjV+/WObPSjCK172/ 6nt9xehzJxgS61syBxyy0KLezWOGLVFZVkMb+RKTOb/V5nw4kTizlIbW1ywGHkBY9Y8X qaYfs4GhQ4R9edMwe9URewJcN5rliZM7OP6+HHaKCh12YaARKTwjCZaUORwGEFadD5l3 jVvg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id a17si21820795pfi.125.2019.03.01.18.55.04; Fri, 01 Mar 2019 18:55:19 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728370AbfCBCyD (ORCPT + 99 others); Fri, 1 Mar 2019 21:54:03 -0500 Received: from mga04.intel.com ([192.55.52.120]:49764 "EHLO mga04.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727782AbfCBCwa (ORCPT ); Fri, 1 Mar 2019 21:52:30 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 01 Mar 2019 18:52:28 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.58,430,1544515200"; d="scan'208";a="148572610" Received: from romley-ivt3.sc.intel.com ([172.25.110.60]) by fmsmga004.fm.intel.com with ESMTP; 01 Mar 2019 18:52:28 -0800 From: Fenghua Yu To: "Thomas Gleixner" , "Ingo Molnar" , "Borislav Petkov" , "H Peter Anvin" , "Paolo Bonzini" , "Dave Hansen" , "Ashok Raj" , "Peter Zijlstra" , "Ravi V Shankar" , "Xiaoyao Li " Cc: "linux-kernel" , "x86" , kvm@vger.kernel.org, Fenghua Yu Subject: [PATCH v4 08/17] x86/clearcpuid: Support multiple clearcpuid options Date: Fri, 1 Mar 2019 18:45:02 -0800 Message-Id: <1551494711-213533-9-git-send-email-fenghua.yu@intel.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1551494711-213533-1-git-send-email-fenghua.yu@intel.com> References: <1551494711-213533-1-git-send-email-fenghua.yu@intel.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Currently only one kernel option "clearcpuid=" can be picked up by kernel during boot time. In some cases, user may want to clear a few cpu caps. This may be useful to replace endless (new) kernel options like nosmep, nosmap, etc. We add support of multiple clearcpuid options to allow user to clear multiple cpu caps. Signed-off-by: Fenghua Yu --- arch/x86/include/asm/cmdline.h | 3 +++ arch/x86/kernel/fpu/init.c | 30 ++++++++++++++++++++---------- arch/x86/lib/cmdline.c | 17 +++++++++++++++-- 3 files changed, 38 insertions(+), 12 deletions(-) diff --git a/arch/x86/include/asm/cmdline.h b/arch/x86/include/asm/cmdline.h index 6faaf27e8899..059e29558bb3 100644 --- a/arch/x86/include/asm/cmdline.h +++ b/arch/x86/include/asm/cmdline.h @@ -5,5 +5,8 @@ int cmdline_find_option_bool(const char *cmdline_ptr, const char *option); int cmdline_find_option(const char *cmdline_ptr, const char *option, char *buffer, int bufsize); +int cmdline_find_option_in_range(const char *cmdline_ptr, int cmdline_size, + const char *option, char *buffer, int bufsize, + char **arg_pos); #endif /* _ASM_X86_CMDLINE_H */ diff --git a/arch/x86/kernel/fpu/init.c b/arch/x86/kernel/fpu/init.c index 6abd83572b01..88bbba7ee96a 100644 --- a/arch/x86/kernel/fpu/init.c +++ b/arch/x86/kernel/fpu/init.c @@ -243,16 +243,31 @@ static void __init fpu__init_system_ctx_switch(void) WARN_ON_FPU(current->thread.fpu.initialized); } +static void __init clear_cpuid(void) +{ + char arg[32], *argptr, *option_pos, clearcpuid_option[] = "clearcpuid"; + int bit, cmdline_size; + + /* Find each option in boot_command_line and clear specified cpu cap. */ + cmdline_size = COMMAND_LINE_SIZE; + while (cmdline_find_option_in_range(boot_command_line, cmdline_size, + clearcpuid_option, arg, + sizeof(arg), &option_pos) >= 0) { + /* Chang command line range for next search. */ + cmdline_size = option_pos - boot_command_line + 1; + argptr = arg; + if (get_option(&argptr, &bit) && + bit >= 0 && bit < NCAPINTS * 32) + setup_clear_cpu_cap(bit); + } +} + /* * We parse fpu parameters early because fpu__init_system() is executed * before parse_early_param(). */ 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); @@ -271,12 +286,7 @@ 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); + clear_cpuid(); } /* diff --git a/arch/x86/lib/cmdline.c b/arch/x86/lib/cmdline.c index 3261abb21ef4..9cf1a0773877 100644 --- a/arch/x86/lib/cmdline.c +++ b/arch/x86/lib/cmdline.c @@ -114,13 +114,15 @@ __cmdline_find_option_bool(const char *cmdline, int max_cmdline_size, * @option: option string to look for * @buffer: memory buffer to return the option argument * @bufsize: size of the supplied memory buffer + * @option_pos: pointer to the option if found * * Returns the length of the argument (regardless of if it was * truncated to fit in the buffer), or -1 on not found. */ static int __cmdline_find_option(const char *cmdline, int max_cmdline_size, - const char *option, char *buffer, int bufsize) + const char *option, char *buffer, int bufsize, + char **arg_pos) { char c; int pos = 0, len = -1; @@ -164,6 +166,9 @@ __cmdline_find_option(const char *cmdline, int max_cmdline_size, len = 0; bufptr = buffer; state = st_bufcpy; + if (arg_pos) + *arg_pos = (char *)cmdline - + strlen(option) - 1; break; } else if (c == *opptr++) { /* @@ -211,5 +216,13 @@ int cmdline_find_option(const char *cmdline, const char *option, char *buffer, int bufsize) { return __cmdline_find_option(cmdline, COMMAND_LINE_SIZE, option, - buffer, bufsize); + buffer, bufsize, NULL); +} + +int cmdline_find_option_in_range(const char *cmdline, int cmdline_size, + char *option, char *buffer, int bufsize, + char **arg_pos) +{ + return __cmdline_find_option(cmdline, cmdline_size, option, buffer, + bufsize, arg_pos); } -- 2.7.4