Re: [PATCH] x86/alternatives: gracefully skip unrecognized indirect call instructions
Jürgen Groß <[email protected]>
| Newsgroups | gmane.linux.kernel |
|---|---|
| Message-ID | <[email protected]> |
On 13.08.26 21:57, 李则良 wrote: > I am currently testing the more general approach shown below. Your > review is also appreciated. > > on vmlinux-O1: > > 0xffffffff82f447de <+126>: ff 15 a4 a9 cf ff call QWORD PTR > [rip+0xffffffffffcfa9a4] # 0xffffffff82c3f188 <pv_ops+8> > 0xffffffff82f447e4 <+132>: eb f8 jmp > 0xffffffff82f447de <early_fixup_exception+126> > 0xffffffff82f447e6 <+134>: 5b pop rbx > 0xffffffff82f447e7 <+135>: 41 5c pop r12 > 0xffffffff82f447e9 <+137>: 5d pop rbp > > on vmlinux-O2: > > 0xffffffff82f3bf4f <+127>: ff 15 33 32 d0 ff call QWORD PTR > [rip+0xffffffffffd03233] # 0xffffffff82c3f188 <pv_ops+8> > 0xffffffff82f3bf55 <+133>: eb f8 jmp > 0xffffffff82f3bf4f <early_fixup_exception+127> > 0xffffffff82f3bf57 <+135>: 5b pop rbx > 0xffffffff82f3bf58 <+136>: 41 5c pop r12 > 0xffffffff82f3bf5a <+138>: 5d pop rbp > > This is an early draft – please review. Thanks in advance. > > From 5989dcf448e4d23ea4f3a0f91fec34f3dd25d26c Mon Sep 17 00:00:00 2001 > From: Zeliang Li <[email protected]> > Date: Fri, 14 Aug 2026 03:17:38 +0800 > Subject: [PATCH] x86/paravirt: Force RIP-relative paravirt calls under low > optimization levels > > When compiling the kernel with non-standard lower optimization levels like > -O1 (e.g., during specific debugging or framework testing setups) using > newer toolchains like GCC 15.2.0, the compiler exhibits passive register > hoisting. In complex code paths like early_fixup_exception(), it caches the > base address of the global 'pv_ops' structure into a general-purpose register > instead of issuing direct RIP-relative memory loads, producing: > > mov $0xffffffff82c3f180, %rbx > call *0x8(%rbx) > > While this behavior is bypassed under aggressive -O2 optimizations, under -O1 > it leaves a register-relative indirect call. This violates the strict format > assertion in the x86 alternative text-patching engine (alt_replace_call), > which expects an 'ALT_FLAG_DIRECT_CALL' site to be a standard 6-byte > RIP-relative indirect call (ff 15), leading to a boot-time kernel BUG. > > Fix this by changing the x86_64 paravirt inline assembly to use an "i" > (immediate) constraint for the function pointer address, and explicitly > reference it via (%rip) in the assembly template. This removes the > toolchain's ability to select any other addressing mode, guaranteeing the > emission of compliant 'call *pv_ops+offset(%rip)' sequences on x86_64 > regardless of the active compiler -O flag. > > For i386, the original "m" constraint is retained since RIP-relative > addressing does not exist on 32-bit x86. > > Signed-off-by: Zeliang Li <[email protected]> > --- > arch/x86/include/asm/paravirt_types.h | 15 ++++++++++++--- > 1 file changed, 12 insertions(+), 3 deletions(-) > > diff --git a/arch/x86/include/asm/paravirt_types.h > b/arch/x86/include/asm/paravirt_types.h > index b4c4a23e77a1..e8047bdbed3a 100644 > --- a/arch/x86/include/asm/paravirt_types.h > +++ b/arch/x86/include/asm/paravirt_types.h > @@ -184,8 +184,6 @@ struct paravirt_patch_template { > > extern struct paravirt_patch_template pv_ops; > > -#define paravirt_ptr(array, op) [paravirt_opptr] "m" (array.op) > - > /* > * This generates an indirect call based on the operation type number. > * > @@ -197,9 +195,20 @@ extern struct paravirt_patch_template pv_ops; > * OTOH since this is effectively a __nocfi indirect call, the paravirt stubs > * don't need to bother with CFI prefixes. > */ > +#ifdef CONFIG_X86_64 > + > +#define paravirt_ptr(array, op) [paravirt_opptr] "i" (&(array.op)) > #define PARAVIRT_CALL \ > ANNOTATE_RETPOLINE_SAFE "\n\t" \ > - "call *%[paravirt_opptr]" > + "call *%c[paravirt_opptr](%%rip);" > +#else /* CONFIG_X86_32 */ > + > +#define paravirt_ptr(array, op) [paravirt_opptr] "m" (array.op) > +#define PARAVIRT_CALL \ > + ANNOTATE_RETPOLINE_SAFE "\n\t" \ > + "call *%[paravirt_opptr];" > + > +#endif /* CONFIG_X86_64 */ > > /* > * These macros are intended to wrap calls through one of the paravirt Thanks for this solution. I like it much more, especially as it will avoid any nasty compiler optimizations as the one you have observed. When sending this as a proper patch you can add my: Reviewed-by: Juergen Gross <[email protected]> Juergen
OpenPGP_0xB0DE9DD628BF132F.asc
(application/pgp-keys, 3.6 KB)
-----BEGIN PGP PUBLIC KEY BLOCK----- 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 kt+z4drzFUyEjLM1vVvIMjkUoJs= =eeAB -----END PGP PUBLIC KEY BLOCK-----
OpenPGP_signature.asc
(application/pgp-signature, 495 B)
-----BEGIN PGP SIGNATURE----- wsB5BAABCAAjFiEEhRJncuj2BJSl0Jf3sN6d1ii/Ey8FAmp+6scFAwAAAAAACgkQsN6d1ii/Ey8c wwf9E+F8KwcidCrASSsoLrM980LAMRn8AEENGdWYCPQYn9dj3XmgOiuZBp9Umvv+Is6yZCTmjpmk Z38zOQg7lnBvK0NSR+Ii6+C/PazbAM7BTUkHbctRU0ounO2I7Q8Vw4nklAMMFRo8EIk10JbG3G8U eRY/+pLKHPRP8faroL0Cx32KuKGftKBAik8FYfQQrilsLb8MRz5jUq7KGQh4V++D7ygwK2dHs/HY fVfwqlbaQ9eas+udDg0dNRwHRNHDIe3Tkjt9unhuipyeR33Bzdhv7NJWRJxoL9TuPSGxD0XU2AsW WtGqep94mLwLu1LnJ9QRsevd98fFIzvvld2kdryD1A== =3cSR -----END PGP SIGNATURE-----