From: Peter Zijlstra <peterz@infradead.org>
To: Juergen Gross <jgross@suse.com>
Cc: linux-kernel@vger.kernel.org, x86@kernel.org, xin@zytor.com,
Thomas Gleixner <tglx@linutronix.de>,
Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
Dave Hansen <dave.hansen@linux.intel.com>,
"H. Peter Anvin" <hpa@zytor.com>,
Andy Lutomirski <luto@kernel.org>
Subject: Re: [PATCH v2 08/12] x86/extable: Add support for immediate form MSR instructions
Date: Tue, 30 Sep 2025 10:14:42 +0200 [thread overview]
Message-ID: <20250930081442.GG3245006@noisy.programming.kicks-ass.net> (raw)
In-Reply-To: <20250930070356.30695-9-jgross@suse.com>
On Tue, Sep 30, 2025 at 09:03:52AM +0200, Juergen Gross wrote:
> From: "Xin Li (Intel)" <xin@zytor.com>
>
> Signed-off-by: Xin Li (Intel) <xin@zytor.com>
> Signed-off-by: Juergen Gross <jgross@suse.com>
> ---
> V2:
> - new patch, taken from the RFC v2 MSR refactor series by Xin Li
> ---
> arch/x86/include/asm/msr.h | 18 ++++++++++++++++++
> arch/x86/mm/extable.c | 39 +++++++++++++++++++++++++++++++++-----
> 2 files changed, 52 insertions(+), 5 deletions(-)
>
> diff --git a/arch/x86/include/asm/msr.h b/arch/x86/include/asm/msr.h
> index 71f41af11591..cf5205300266 100644
> --- a/arch/x86/include/asm/msr.h
> +++ b/arch/x86/include/asm/msr.h
> @@ -56,6 +56,24 @@ static inline void do_trace_read_msr(u32 msr, u64 val, int failed) {}
> static inline void do_trace_rdpmc(u32 msr, u64 val, int failed) {}
> #endif
>
> +/*
> + * Called only from an MSR fault handler, the instruction pointer points to
> + * the MSR access instruction that caused the fault.
> + */
> +static __always_inline bool is_msr_imm_insn(void *ip)
> +{
> + /*
> + * A full decoder for immediate form MSR instructions appears excessive.
> + */
> +#ifdef CONFIG_X86_64
> + const u8 msr_imm_insn_prefix[] = { 0xc4, 0xe7 };
> +
> + return !memcmp(ip, msr_imm_insn_prefix, sizeof(msr_imm_insn_prefix));
This seems fragile. Those two bytes are basically the first two bytes of
VEX3 and only indicate VEX3.map7. Which is not very specific, but when
combined with the fact that this is an MSR exception, might just work.
Trouble is that it is also possible to encode the immediate form using
EVEX. If a toolchain were to do that, we'd fail to detect it.
(And there is segment prefix stuffing possible I suppose)
> +#else
> + return false;
> +#endif
> +}
> +
> /*
> * __rdmsr() and __wrmsr() are the two primitives which are the bare minimum MSR
> * accessors and should not have any tracing or other functionality piggybacking
> diff --git a/arch/x86/mm/extable.c b/arch/x86/mm/extable.c
> index 2fdc1f1f5adb..c021e4dbc69d 100644
> --- a/arch/x86/mm/extable.c
> +++ b/arch/x86/mm/extable.c
> @@ -166,23 +166,52 @@ static bool ex_handler_uaccess(const struct exception_table_entry *fixup,
> static bool ex_handler_msr(const struct exception_table_entry *fixup,
> struct pt_regs *regs, bool wrmsr, bool safe, int reg)
> {
> + bool imm_insn = is_msr_imm_insn((void *)regs->ip);
> + u32 msr;
> +
> + if (imm_insn)
> + /*
> + * The 32-bit immediate specifying a MSR is encoded into
> + * byte 5 ~ 8 of an immediate form MSR instruction.
> + */
> + msr = *(u32 *)(regs->ip + 5);
> + else
> + msr = (u32)regs->cx;
This seems to have fallen subject to the US tariff induced {} shortage
or something.
Also, EVEX form will have them in other bytes (one further, on account
of EVEX being 4 bytes, rather than 3).
Given this really isn't a fast path or anything, how about we just use
the instruction decoder? Something like:
struct insn insn;
u32 msr = (u32)regs->cx;
ret = insn_decode_kernel(&insn, (void *)regs->ip);
if (!ret && insn.vex_prefix.nbytes)
msr = insn.immediate.value;
should do, I suppose. Isn't that both simpler and more robust?
next prev parent reply other threads:[~2025-09-30 8:14 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-30 7:03 [PATCH v2 00/12] x86/msr: Inline rdmsr/wrmsr instructions Juergen Gross
2025-09-30 7:03 ` [PATCH v2 01/12] coco/tdx: Rename MSR access helpers Juergen Gross
2025-09-30 9:07 ` Kiryl Shutsemau
2025-09-30 7:03 ` [PATCH v2 02/12] x86/sev: Replace call of native_wrmsr() with native_wrmsrq() Juergen Gross
2025-10-07 6:08 ` Nikunj A Dadhania
2025-09-30 7:03 ` [PATCH v2 03/12] x86/kvm: Remove the KVM private read_msr() function Juergen Gross
2025-09-30 16:04 ` Sean Christopherson
2025-10-01 9:14 ` Jürgen Groß
2025-09-30 7:03 ` [PATCH v2 04/12] x86/msr: Minimize usage of native_*() msr access functions Juergen Gross
2025-09-30 7:03 ` [PATCH v2 05/12] x86/msr: Move MSR trace calls one function level up Juergen Gross
2025-09-30 7:03 ` [PATCH v2 06/12] x86/cpufeatures: Add a CPU feature bit for MSR immediate form instructions Juergen Gross
2025-09-30 7:03 ` [PATCH v2 07/12] x86/opcode: Add immediate form MSR instructions Juergen Gross
2025-09-30 7:03 ` [PATCH v2 08/12] x86/extable: Add support for " Juergen Gross
2025-09-30 8:14 ` Peter Zijlstra [this message]
2025-09-30 8:31 ` Jürgen Groß
2025-09-30 7:03 ` [PATCH v2 09/12] x86/msr: Use the alternatives mechanism for WRMSR Juergen Gross
2025-09-30 8:31 ` Peter Zijlstra
2025-09-30 8:46 ` Jürgen Groß
2025-09-30 8:50 ` Peter Zijlstra
2025-09-30 12:51 ` Peter Zijlstra
2025-09-30 15:42 ` Jürgen Groß
2025-10-01 6:43 ` Peter Zijlstra
2025-10-01 7:23 ` Peter Zijlstra
2025-10-03 14:23 ` Dave Hansen
2025-10-03 16:53 ` H. Peter Anvin
2025-10-01 8:49 ` Juergen Gross
2025-10-01 10:50 ` Peter Zijlstra
2025-10-01 11:16 ` Jürgen Groß
2025-09-30 16:00 ` Sean Christopherson
2025-10-01 9:13 ` Jürgen Groß
2025-09-30 7:03 ` [PATCH v2 10/12] x86/msr: Use the alternatives mechanism for RDMSR Juergen Gross
2025-09-30 7:03 ` [PATCH v2 11/12] x86/paravirt: Don't use pv_ops vector for MSR access functions Juergen Gross
2025-09-30 8:38 ` Peter Zijlstra
2025-09-30 9:02 ` Jürgen Groß
2025-09-30 10:04 ` Peter Zijlstra
2025-09-30 10:43 ` Jürgen Groß
2025-09-30 19:49 ` H. Peter Anvin
2025-09-30 19:59 ` H. Peter Anvin
2025-10-01 6:45 ` Peter Zijlstra
2025-09-30 21:27 ` kernel test robot
2025-10-01 5:48 ` Jürgen Groß
2025-09-30 7:03 ` [PATCH v2 12/12] x86/msr: Reduce number of low level MSR access helpers Juergen Gross
2025-09-30 19:19 ` [PATCH v2 00/12] x86/msr: Inline rdmsr/wrmsr instructions H. Peter Anvin
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=20250930081442.GG3245006@noisy.programming.kicks-ass.net \
--to=peterz@infradead.org \
--cc=bp@alien8.de \
--cc=dave.hansen@linux.intel.com \
--cc=hpa@zytor.com \
--cc=jgross@suse.com \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@kernel.org \
--cc=mingo@redhat.com \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
--cc=xin@zytor.com \
/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
all inboxes | Powered by JetHome®