From: Juergen Gross <jgross@suse.com>
To: Peter Zijlstra <peterz@infradead.org>
Cc: linux-kernel@vger.kernel.org, x86@kernel.org,
llvm@lists.linux.dev, xin@zytor.com,
"H. Peter Anvin" <hpa@zytor.com>,
Thomas Gleixner <tglx@linutronix.de>,
Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
Dave Hansen <dave.hansen@linux.intel.com>,
Nathan Chancellor <nathan@kernel.org>,
Nick Desaulniers <nick.desaulniers+lkml@gmail.com>,
Bill Wendling <morbo@google.com>,
Justin Stitt <justinstitt@google.com>
Subject: Re: [PATCH v2 09/12] x86/msr: Use the alternatives mechanism for WRMSR
Date: Wed, 1 Oct 2025 10:49:31 +0200 [thread overview]
Message-ID: <b2e07601-80d9-4a6e-a60a-6667d679494c@suse.com> (raw)
In-Reply-To: <2df26cc0-53bc-499c-8c78-bc24fd8bf882@suse.com>
[-- Attachment #1.1.1: Type: text/plain, Size: 3918 bytes --]
On 30.09.25 10:46, Jürgen Groß wrote:
> On 30.09.25 10:31, Peter Zijlstra wrote:
>> On Tue, Sep 30, 2025 at 09:03:53AM +0200, Juergen Gross wrote:
>>
>>> +static __always_inline bool __wrmsrq_constant(u32 msr, u64 val, int type)
>>> +{
>>> + BUILD_BUG_ON(!__builtin_constant_p(msr));
>>> +
>>> + asm_inline volatile goto(
>>> + "1:\n"
>>> + ALTERNATIVE_2(PREPARE_RCX_RDX_FOR_WRMSR
>>> + "2: ds wrmsr",
>>> + PREPARE_RCX_RDX_FOR_WRMSR
>>> + ASM_WRMSRNS,
>>> + X86_FEATURE_WRMSRNS,
>>> + ASM_WRMSRNS_IMM,
>>> + X86_FEATURE_MSR_IMM)
>>> + _ASM_EXTABLE_TYPE(1b, %l[badmsr], %c[type]) /* For WRMSRNS
>>> immediate */
>>> + _ASM_EXTABLE_TYPE(2b, %l[badmsr], %c[type]) /* For WRMSR(NS) */
>>> +
>>> + :
>>> + : [val] "a" (val), [msr] "i" (msr), [type] "i" (type)
>>> + : "memory", "ecx", "rdx"
>>> + : badmsr);
>>> +
>>> + return false;
>>> +
>>> +badmsr:
>>> + return true;
>>> +}
>>
>> Just wondering, would something this work?
>>
>> asm_inline volatile goto(
>> "1:\n"
>> ALTERNATIVE(PREPARE_RCX_RDX_FOR_WRMSR
>> "2:\n"
>> ALTERNATIVE("ds wrmsr",
>> ASM_WRMSRNS, X86_FEATURE_WRMSRNS),
>> ASM_WRMSRNS_IMM, X86_FEATURE_MSR_IMM);
>> _ASM_EXTABLE_TYPE(1b, %l[badmsr], %c[type]) /* For WRMSRNS
>> immediate */
>> _ASM_EXTABLE_TYPE(2b, %l[badmsr], %c[type]) /* For WRMSR(NS) */
>>
>> :
>> : [val] "a" (val), [msr] "i" (msr), [type] "i" (type)
>> : "memory", "ecx", "rdx"
>> : badmsr);
>>
>> Its a bit weird because the nested alternative isn't for the exact same
>> position I suppose. But I find it a more readable form.
>
> I don't think it would work. Nested ALTERNATIVE()s do work only with
> all of them starting at the same location. Have a look at the
> ALTERNATIVE() macro, which is defining the label "771" via OLDINSTR()
> and then referring to this label via ALTINSTR_ENTRY(). In your case
> the ALTINSTR_ENTRY() of the outer ALTERNATIVE() invocation would find
> the wrong "771" label (the one of the inner ALTERNATIVE()).
>
> Allowing such constructs would probably require switching from preprocessor
> macros to assembler macros.
Thinking more about that I believe there are additional problems:
Having overlapping alternatives not starting at the same address will result
in problems with length padding of the outer alternative in case the inner
one starting later is extending past the end of the outer one. This might be
possible to handle, but it will be tedious.
A similar problem occurs with my recent series for merging nested alternative
patching into a temporary buffer. Currently the code relies on all nested
alternatives to start at the same location.
Using your idea with pv_ops could result in the inner alternative not being
at the start of the outer alternative AND being not the initial code. This
would result in patching in the .altinstructions area instead of the normal
.text site, resulting in possible loss of a patching action if the patched
area would have been used as a replacement before.
So in my opinion allowing alternatives to nest without all inner levels
starting at the same location as the outermost level would be a receipt for
failure.
I think I'll write another patch to BUG() in case such a situation is being
detected.
Juergen
[-- Attachment #1.1.2: OpenPGP public key --]
[-- Type: application/pgp-keys, Size: 3743 bytes --]
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 495 bytes --]
next prev parent reply other threads:[~2025-10-01 8:50 UTC|newest]
Thread overview: 17+ 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 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 [this message]
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 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=b2e07601-80d9-4a6e-a60a-6667d679494c@suse.com \
--to=jgross@suse.com \
--cc=bp@alien8.de \
--cc=dave.hansen@linux.intel.com \
--cc=hpa@zytor.com \
--cc=justinstitt@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=llvm@lists.linux.dev \
--cc=mingo@redhat.com \
--cc=morbo@google.com \
--cc=nathan@kernel.org \
--cc=nick.desaulniers+lkml@gmail.com \
--cc=peterz@infradead.org \
--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