From: Roger Pau Monné Date: Tue, 9 Apr 2024 12:50:46 +0000 (+0200) Subject: x86/alternatives: fix .init section reference in _apply_alternatives() X-Git-Tag: RELEASE-4.17.4~18 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=e60fc805d8a2ee2822dc96715bca44ebed135a8c;p=xen.git x86/alternatives: fix .init section reference in _apply_alternatives() The code in _apply_alternatives() will unconditionally attempt to read __initdata_cf_clobber_{start,end} when called as part of applying alternatives to a livepatch payload when Xen is using IBT. That leads to a page-fault as __initdata_cf_clobber_{start,end} living in .init section will have been unmapped by the time a livepatch gets loaded. Fix by adding a check that limits the clobbering of endbr64 instructions to boot time only. Fixes: 37ed5da851b8 ('x86/altcall: Optimise away endbr64 instruction where possible') Signed-off-by: Roger Pau Monné Reviewed-by: Andrew Cooper (cherry picked from commit 4be1fef1e6572c2be0bd378902ffb62a6e73faeb) --- diff --git a/xen/arch/x86/alternative.c b/xen/arch/x86/alternative.c index 1d59dffc46..8356414be7 100644 --- a/xen/arch/x86/alternative.c +++ b/xen/arch/x86/alternative.c @@ -338,7 +338,7 @@ static void init_or_livepatch _apply_alternatives(struct alt_instr *start, * Clobber endbr64 instructions now that altcall has finished optimising * all indirect branches to direct ones. */ - if ( force && cpu_has_xen_ibt ) + if ( force && cpu_has_xen_ibt && system_state < SYS_STATE_active ) { void *const *val; unsigned int clobbered = 0;