From: Andrew Cooper Date: Sat, 19 Apr 2025 23:44:17 +0000 (+0100) Subject: x86/alternatives: Rework information passing into nmi_apply_alternatives() X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=d4ef51d840f4329782cd204b0899be27e8592693;p=xen.git x86/alternatives: Rework information passing into nmi_apply_alternatives() nmi_apply_alternatives() is soon going to need to dispatch to multiple functions, and a force parameter is not a good way of passing information. Introduce ALT_INSNS and ALT_CALLS to pass in at the top level to select the operation(s) desired. They represent what will happen when we've separated the altcalls out of the general alternative instructions infrastructure, although in the short term we still need to synthesise the force parameter for _apply_alternatives(). Move two externs to reduce their scope a little. No functional change. Signed-off-by: Andrew Cooper Reviewed-by: Jan Beulich --- diff --git a/xen/arch/x86/alternative.c b/xen/arch/x86/alternative.c index d1a3b7ea7c..9aa591b364 100644 --- a/xen/arch/x86/alternative.c +++ b/xen/arch/x86/alternative.c @@ -19,8 +19,6 @@ #define MAX_PATCH_LEN (255-1) -extern struct alt_instr __alt_instructions[], __alt_instructions_end[]; - #ifdef K8_NOP1 static const unsigned char k8nops[] init_or_livepatch_const = { K8_NOP1, @@ -387,9 +385,13 @@ int apply_alternatives(struct alt_instr *start, struct alt_instr *end) } #endif +#define ALT_INSNS (1U << 0) +#define ALT_CALLS (1U << 1) static unsigned int __initdata alt_todo; static unsigned int __initdata alt_done; +extern struct alt_instr __alt_instructions[], __alt_instructions_end[]; + /* * At boot time, we patch alternatives in NMI context. This means that the * active NMI-shadow will defer any further NMIs, removing the slim race @@ -419,7 +421,7 @@ static int __init cf_check nmi_apply_alternatives( flush_local(FLUSH_TLB_GLOBAL); rc = _apply_alternatives(__alt_instructions, __alt_instructions_end, - alt_done); + alt_todo == ALT_CALLS); if ( rc ) panic("Unable to apply alternatives: %d\n", rc); @@ -442,7 +444,7 @@ static int __init cf_check nmi_apply_alternatives( * This routine is called with local interrupt disabled and used during * bootup. */ -static void __init _alternative_instructions(bool force) +static void __init _alternative_instructions(unsigned int what) { unsigned int i; nmi_callback_t *saved_nmi_callback; @@ -460,7 +462,7 @@ static void __init _alternative_instructions(bool force) ASSERT(!local_irq_is_enabled()); /* Set what operation to perform /before/ setting the callback. */ - alt_todo = 1u << force; + alt_todo = what; barrier(); /* @@ -490,12 +492,12 @@ static void __init _alternative_instructions(bool force) void __init alternative_instructions(void) { arch_init_ideal_nops(); - _alternative_instructions(false); + _alternative_instructions(ALT_INSNS); } void __init boot_apply_alt_calls(void) { local_irq_disable(); - _alternative_instructions(true); + _alternative_instructions(ALT_CALLS); local_irq_enable(); }