From: Andrew Cooper Date: Mon, 14 Feb 2022 12:12:13 +0000 (+0000) Subject: x86/hvm: Use __initdata_cf_clobber for hvm_funcs X-Git-Tag: archive/raspbian/4.17.0-1+rpi1^2~33^2~921 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=8bf7240842c765b6fa13095572aa77c38ff27acf;p=xen.git x86/hvm: Use __initdata_cf_clobber for hvm_funcs Now that all calls through hvm_funcs are fully altcall'd, harden all the svm and vmx function pointer targets. This drops 106 endbr64 instructions. Clobbering does come with a theoretical risk. The non-pointer fields of {svm,vmx}_function_table can in theory happen to form a bit pattern matching a pointer into .text at a legal endbr64 instruction, but this is expected to be implausible for anything liable to pass code review. While at it, move hvm_funcs into __ro_after_init now that this exists. Signed-off-by: Andrew Cooper Reviewed-by: Jan Beulich --- diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index cdd1529014..709a4191ef 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -88,7 +88,7 @@ unsigned int opt_hvm_debug_level __read_mostly; integer_param("hvm_debug", opt_hvm_debug_level); #endif -struct hvm_function_table hvm_funcs __read_mostly; +struct hvm_function_table __ro_after_init hvm_funcs; /* * The I/O permission bitmap is globally shared by all HVM guests except diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c index 63535a74b5..b80d4af6cb 100644 --- a/xen/arch/x86/hvm/svm/svm.c +++ b/xen/arch/x86/hvm/svm/svm.c @@ -2513,7 +2513,7 @@ static void cf_check svm_set_reg(struct vcpu *v, unsigned int reg, uint64_t val) } } -static struct hvm_function_table __initdata svm_function_table = { +static struct hvm_function_table __initdata_cf_clobber svm_function_table = { .name = "SVM", .cpu_up_prepare = svm_cpu_up_prepare, .cpu_dead = svm_cpu_dead, diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index 41db538a9e..758df33218 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -2473,7 +2473,7 @@ static void cf_check vmx_set_reg(struct vcpu *v, unsigned int reg, uint64_t val) vmx_vmcs_exit(v); } -static struct hvm_function_table __initdata vmx_function_table = { +static struct hvm_function_table __initdata_cf_clobber vmx_function_table = { .name = "VMX", .cpu_up_prepare = vmx_cpu_up_prepare, .cpu_dead = vmx_cpu_dead,