Message ID | 20200402154616.16927-2-jgross@suse.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Add hypervisor sysfs-like support | expand |
On 02.04.2020 17:46, Juergen Gross wrote: > In case opt_ept_ad has not been set explicitly by the user via command > line or runtime parameter, it is treated as "no" on Avoton cpus. > > Change that handling by setting opt_ept_ad to 0 for this cpu type > explicitly if no user value has been set. > > By putting this into the (renamed) boot time initialization of vmcs.c > _vmx_cpu_up() can be made static. > > Signed-off-by: Juergen Gross <jgross@suse.com> Reviewed-by: Jan Beulich <jbeulich@suse.com> albeit preferably with ... > @@ -2108,9 +2104,21 @@ static void vmcs_dump(unsigned char ch) > printk("**************************************\n"); > } > > -void __init setup_vmcs_dump(void) > +int __init vmx_vmcs_init(void) > { > - register_keyhandler('v', vmcs_dump, "dump VT-x VMCSs", 1); > + int ret; > + > + if ( opt_ept_ad < 0 ) > + /* Work around Erratum AVR41 on Avoton processors. */ > + opt_ept_ad = (boot_cpu_data.x86 == 6 && > + boot_cpu_data.x86_model == 0x4d) ? 0 : 1; ... no use of the conditional operator here - the result of the && (or its logical inversion to be precise) would be quite fine to use directly here. Jan
On 03.04.20 16:05, Jan Beulich wrote: > On 02.04.2020 17:46, Juergen Gross wrote: >> In case opt_ept_ad has not been set explicitly by the user via command >> line or runtime parameter, it is treated as "no" on Avoton cpus. >> >> Change that handling by setting opt_ept_ad to 0 for this cpu type >> explicitly if no user value has been set. >> >> By putting this into the (renamed) boot time initialization of vmcs.c >> _vmx_cpu_up() can be made static. >> >> Signed-off-by: Juergen Gross <jgross@suse.com> > > Reviewed-by: Jan Beulich <jbeulich@suse.com> > albeit preferably with ... > >> @@ -2108,9 +2104,21 @@ static void vmcs_dump(unsigned char ch) >> printk("**************************************\n"); >> } >> >> -void __init setup_vmcs_dump(void) >> +int __init vmx_vmcs_init(void) >> { >> - register_keyhandler('v', vmcs_dump, "dump VT-x VMCSs", 1); >> + int ret; >> + >> + if ( opt_ept_ad < 0 ) >> + /* Work around Erratum AVR41 on Avoton processors. */ >> + opt_ept_ad = (boot_cpu_data.x86 == 6 && >> + boot_cpu_data.x86_model == 0x4d) ? 0 : 1; > > ... no use of the conditional operator here - the result of the > && (or its logical inversion to be precise) would be quite fine > to use directly here. Okay. Juergen
diff --git a/xen/arch/x86/hvm/vmx/vmcs.c b/xen/arch/x86/hvm/vmx/vmcs.c index 4c23645454..24f2bd6e43 100644 --- a/xen/arch/x86/hvm/vmx/vmcs.c +++ b/xen/arch/x86/hvm/vmx/vmcs.c @@ -315,10 +315,6 @@ static int vmx_init_vmcs_config(void) if ( !opt_ept_ad ) _vmx_ept_vpid_cap &= ~VMX_EPT_AD_BIT; - else if ( /* Work around Erratum AVR41 on Avoton processors. */ - boot_cpu_data.x86 == 6 && boot_cpu_data.x86_model == 0x4d && - opt_ept_ad < 0 ) - _vmx_ept_vpid_cap &= ~VMX_EPT_AD_BIT; /* * Additional sanity checking before using EPT: @@ -652,7 +648,7 @@ void vmx_cpu_dead(unsigned int cpu) vmx_pi_desc_fixup(cpu); } -int _vmx_cpu_up(bool bsp) +static int _vmx_cpu_up(bool bsp) { u32 eax, edx; int rc, bios_locked, cpu = smp_processor_id(); @@ -2108,9 +2104,21 @@ static void vmcs_dump(unsigned char ch) printk("**************************************\n"); } -void __init setup_vmcs_dump(void) +int __init vmx_vmcs_init(void) { - register_keyhandler('v', vmcs_dump, "dump VT-x VMCSs", 1); + int ret; + + if ( opt_ept_ad < 0 ) + /* Work around Erratum AVR41 on Avoton processors. */ + opt_ept_ad = (boot_cpu_data.x86 == 6 && + boot_cpu_data.x86_model == 0x4d) ? 0 : 1; + + ret = _vmx_cpu_up(true); + + if ( !ret ) + register_keyhandler('v', vmcs_dump, "dump VT-x VMCSs", 1); + + return ret; } static void __init __maybe_unused build_assertions(void) diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index 1c398fdb6e..05e99f4bee 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -2478,7 +2478,7 @@ const struct hvm_function_table * __init start_vmx(void) { set_in_cr4(X86_CR4_VMXE); - if ( _vmx_cpu_up(true) ) + if ( vmx_vmcs_init() ) { printk("VMX: failed to initialise.\n"); return NULL; @@ -2549,8 +2549,6 @@ const struct hvm_function_table * __init start_vmx(void) vmx_function_table.get_guest_bndcfgs = vmx_get_guest_bndcfgs; } - setup_vmcs_dump(); - lbr_tsx_fixup_check(); bdf93_fixup_check(); diff --git a/xen/include/asm-x86/hvm/vmx/vmcs.h b/xen/include/asm-x86/hvm/vmx/vmcs.h index 95c1dea7b8..906810592f 100644 --- a/xen/include/asm-x86/hvm/vmx/vmcs.h +++ b/xen/include/asm-x86/hvm/vmx/vmcs.h @@ -21,11 +21,10 @@ #include <xen/mm.h> extern void vmcs_dump_vcpu(struct vcpu *v); -extern void setup_vmcs_dump(void); +extern int vmx_vmcs_init(void); extern int vmx_cpu_up_prepare(unsigned int cpu); extern void vmx_cpu_dead(unsigned int cpu); extern int vmx_cpu_up(void); -extern int _vmx_cpu_up(bool bsp); extern void vmx_cpu_down(void); struct vmcs_struct {
In case opt_ept_ad has not been set explicitly by the user via command line or runtime parameter, it is treated as "no" on Avoton cpus. Change that handling by setting opt_ept_ad to 0 for this cpu type explicitly if no user value has been set. By putting this into the (renamed) boot time initialization of vmcs.c _vmx_cpu_up() can be made static. Signed-off-by: Juergen Gross <jgross@suse.com> --- xen/arch/x86/hvm/vmx/vmcs.c | 22 +++++++++++++++------- xen/arch/x86/hvm/vmx/vmx.c | 4 +--- xen/include/asm-x86/hvm/vmx/vmcs.h | 3 +-- 3 files changed, 17 insertions(+), 12 deletions(-)