x86/alternatives: serialize after (self-)modifying code

While supposedly safe via enforcing a control flow change when modifying
already prefetched code, it may not really be. Afaik a request is
pending to drop the first of the two options in the SDM's "Handling
Self- and Cross-Modifying Code" section (still present there as of
version 087). Insert a serializing instruction there, and remove the
"noinline" in exchange.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Jason Andryuk <jason.andryuk@amd.com>
This commit is contained in:
Jan Beulich committed 2025-07-23 15:17:28 +02:00
1 parent 5cbaa5d92e
commit c5b06d0b1b
1 file changed
+8 -3
+8 -3
View File
@@ -194,13 +194,18 @@ void *place_ret(void *ptr)
* You should run this with interrupts disabled or on code that is not
* executing.
*
* "noinline" to cause control flow change and thus invalidate I$ and
* cause refetch after modification.
* While the SDM continues to suggest using "noinline" would be sufficient, it
* may not be, e.g. due to errata. Issue a serializing insn afterwards, unless
* this is for live-patching, where we modify code before it goes live. Issue
* a serializing insn which is unlikely to be intercepted by a hypervisor, in
* case we run virtualized ourselves.
*/
static void init_or_livepatch noinline
static void init_or_livepatch
text_poke(void *addr, const void *opcode, size_t len)
{
memcpy(addr, opcode, len);
if ( system_state < SYS_STATE_active )
asm volatile ( "mov %0, %%cr2" :: "r" (0L) : "memory" );
}
extern void *const __initdata_cf_clobber_start[];
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.