linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "tip-bot2 for Juergen Gross" <tip-bot2@linutronix.de>
To: linux-tip-commits@vger.kernel.org
Cc: Juergen Gross <jgross@suse.com>, Borislav Petkov <bp@suse.de>,
	x86@kernel.org, linux-kernel@vger.kernel.org
Subject: [tip: x86/alternatives] x86/alternative: Support not-feature
Date: Fri, 12 Mar 2021 11:54:39 -0000	[thread overview]
Message-ID: <161555007985.398.7479645295029513973.tip-bot2@tip-bot2> (raw)
In-Reply-To: <20210311142319.4723-6-jgross@suse.com>

The following commit has been merged into the x86/alternatives branch of tip:

Commit-ID:     dda7bb76484978316bb412a353789ebc5901de36
Gitweb:        https://git.kernel.org/tip/dda7bb76484978316bb412a353789ebc5901de36
Author:        Juergen Gross <jgross@suse.com>
AuthorDate:    Thu, 11 Mar 2021 15:23:10 +01:00
Committer:     Borislav Petkov <bp@suse.de>
CommitterDate: Thu, 11 Mar 2021 16:44:01 +01:00

x86/alternative: Support not-feature

Add support for alternative patching for the case a feature is not
present on the current CPU. For users of ALTERNATIVE() and friends, an
inverted feature is specified by applying the ALT_NOT() macro to it,
e.g.:

  ALTERNATIVE(old, new, ALT_NOT(feature));

Committer note:

The decision to encode the NOT-bit in the feature bit itself is because
a future change which would make objtool generate such alternative
calls, would keep the code in objtool itself fairly simple.

Also, this allows for the alternative macros to support the NOT feature
without having to change them.

Finally, the u16 cpuid member encoding the X86_FEATURE_ flags is not an
ABI so if more bits are needed, cpuid itself can be enlarged or a flags
field can be added to struct alt_instr after having considered the size
growth in either cases.

Signed-off-by: Juergen Gross <jgross@suse.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Link: https://lkml.kernel.org/r/20210311142319.4723-6-jgross@suse.com
---
 arch/x86/include/asm/alternative.h |  3 +++
 arch/x86/kernel/alternative.c      | 20 +++++++++++++++-----
 2 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/arch/x86/include/asm/alternative.h b/arch/x86/include/asm/alternative.h
index 53f295f..649e56f 100644
--- a/arch/x86/include/asm/alternative.h
+++ b/arch/x86/include/asm/alternative.h
@@ -6,6 +6,9 @@
 #include <linux/stringify.h>
 #include <asm/asm.h>
 
+#define ALTINSTR_FLAG_INV	(1 << 15)
+#define ALT_NOT(feat)		((feat) | ALTINSTR_FLAG_INV)
+
 #ifndef __ASSEMBLY__
 
 #include <linux/stddef.h>
diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c
index 8d778e4..133b549 100644
--- a/arch/x86/kernel/alternative.c
+++ b/arch/x86/kernel/alternative.c
@@ -388,21 +388,31 @@ void __init_or_module noinline apply_alternatives(struct alt_instr *start,
 	 */
 	for (a = start; a < end; a++) {
 		int insn_buff_sz = 0;
+		/* Mask away "NOT" flag bit for feature to test. */
+		u16 feature = a->cpuid & ~ALTINSTR_FLAG_INV;
 
 		instr = (u8 *)&a->instr_offset + a->instr_offset;
 		replacement = (u8 *)&a->repl_offset + a->repl_offset;
 		BUG_ON(a->instrlen > sizeof(insn_buff));
-		BUG_ON(a->cpuid >= (NCAPINTS + NBUGINTS) * 32);
-		if (!boot_cpu_has(a->cpuid)) {
+		BUG_ON(feature >= (NCAPINTS + NBUGINTS) * 32);
+
+		/*
+		 * Patch if either:
+		 * - feature is present
+		 * - feature not present but ALTINSTR_FLAG_INV is set to mean,
+		 *   patch if feature is *NOT* present.
+		 */
+		if (!boot_cpu_has(feature) == !(a->cpuid & ALTINSTR_FLAG_INV)) {
 			if (a->padlen > 1)
 				optimize_nops(a, instr);
 
 			continue;
 		}
 
-		DPRINTK("feat: %d*32+%d, old: (%pS (%px) len: %d), repl: (%px, len: %d), pad: %d",
-			a->cpuid >> 5,
-			a->cpuid & 0x1f,
+		DPRINTK("feat: %s%d*32+%d, old: (%pS (%px) len: %d), repl: (%px, len: %d), pad: %d",
+			(a->cpuid & ALTINSTR_FLAG_INV) ? "!" : "",
+			feature >> 5,
+			feature & 0x1f,
 			instr, instr, a->instrlen,
 			replacement, a->replacementlen, a->padlen);
 

  reply	other threads:[~2021-03-12 11:55 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-11 14:23 [PATCH v7 00/14] x86: major paravirt cleanup Juergen Gross
2021-03-11 14:23 ` [PATCH v7 01/14] x86/alternative: merge include files Juergen Gross
2021-03-12 11:54   ` [tip: x86/alternatives] x86/alternative: Merge " tip-bot2 for Juergen Gross
2021-03-11 14:23 ` [PATCH v7 02/14] static_call: move struct static_call_key definition to static_call_types.h Juergen Gross
2021-03-12 11:54   ` [tip: x86/alternatives] static_call: Move " tip-bot2 for Juergen Gross
2021-03-11 14:23 ` [PATCH v7 03/14] static_call: add function to query current function Juergen Gross
2021-03-12 11:54   ` [tip: x86/alternatives] static_call: Add " tip-bot2 for Juergen Gross
2021-03-11 14:23 ` [PATCH v7 04/14] x86/paravirt: switch time pvops functions to use static_call() Juergen Gross
2021-03-12 11:54   ` [tip: x86/alternatives] x86/paravirt: Switch " tip-bot2 for Juergen Gross
2021-03-11 14:23 ` [PATCH v7 05/14] x86/alternative: support not-feature Juergen Gross
2021-03-12 11:54   ` tip-bot2 for Juergen Gross [this message]
2021-03-11 14:23 ` [PATCH v7 06/14] x86/alternative: support ALTERNATIVE_TERNARY Juergen Gross
2021-03-12 11:54   ` [tip: x86/alternatives] x86/alternative: Support ALTERNATIVE_TERNARY tip-bot2 for Juergen Gross
2021-03-11 14:23 ` [PATCH v7 07/14] x86/alternative: don't open code ALTERNATIVE_TERNARY() in _static_cpu_has() Juergen Gross
2021-03-12 11:54   ` [tip: x86/alternatives] x86/alternative: Use " tip-bot2 for Juergen Gross
2021-03-11 14:23 ` [PATCH v7 08/14] x86: add new features for paravirt patching Juergen Gross
2021-03-12 11:54   ` [tip: x86/alternatives] x86/paravirt: Add " tip-bot2 for Juergen Gross
2021-03-11 14:23 ` [PATCH v7 09/14] x86/paravirt: remove no longer needed 32-bit pvops cruft Juergen Gross
2021-03-12 11:54   ` [tip: x86/alternatives] x86/paravirt: Remove " tip-bot2 for Juergen Gross
2021-03-11 14:23 ` [PATCH v7 10/14] x86/paravirt: simplify paravirt macros Juergen Gross
2021-03-12 11:54   ` [tip: x86/alternatives] x86/paravirt: Simplify " tip-bot2 for Juergen Gross
2021-03-11 14:23 ` [PATCH v7 11/14] x86/paravirt: switch iret pvops to ALTERNATIVE Juergen Gross
2021-03-12 11:54   ` [tip: x86/alternatives] x86/paravirt: Switch " tip-bot2 for Juergen Gross
2021-03-11 14:23 ` [PATCH v7 12/14] x86/paravirt: add new macros PVOP_ALT* supporting pvops in ALTERNATIVEs Juergen Gross
2021-03-12 11:54   ` [tip: x86/alternatives] x86/paravirt: Add new PVOP_ALT* macros to support " tip-bot2 for Juergen Gross
2021-03-11 14:23 ` [PATCH v7 13/14] x86/paravirt: switch functions with custom code to ALTERNATIVE Juergen Gross
2021-03-12 11:54   ` [tip: x86/alternatives] x86/paravirt: Switch " tip-bot2 for Juergen Gross
2021-03-11 14:23 ` [PATCH v7 14/14] x86/paravirt: have only one paravirt patch function Juergen Gross
2021-03-12 11:54   ` [tip: x86/alternatives] x86/paravirt: Have " tip-bot2 for Juergen Gross

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=161555007985.398.7479645295029513973.tip-bot2@tip-bot2 \
    --to=tip-bot2@linutronix.de \
    --cc=bp@suse.de \
    --cc=jgross@suse.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tip-commits@vger.kernel.org \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).