[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 2/6] x86: save GUEST_BNDCFGS on context switch...
...to avoid the need for a VMCS reload when the value of MSR_IA32_BNDCFGS is read by the tool-stack. Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx> --- Cc: Jan Beulich <jbeulich@xxxxxxxx> Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Cc: Wei Liu <wei.liu2@xxxxxxxxxx> Cc: "Roger Pau Monné" <roger.pau@xxxxxxxxxx> Cc: Jun Nakajima <jun.nakajima@xxxxxxxxx> Cc: Kevin Tian <kevin.tian@xxxxxxxxx> --- xen/arch/x86/hvm/hvm.c | 18 +++++++++++++++--- xen/arch/x86/hvm/vmx/vmx.c | 3 +++ xen/include/asm-x86/msr.h | 5 +++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index 5fd5478b7d..b86aed7c24 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -311,6 +311,7 @@ int hvm_set_guest_pat(struct vcpu *v, u64 guest_pat) bool hvm_set_guest_bndcfgs(struct vcpu *v, uint64_t val) { const struct cpuid_policy *cp = v->domain->arch.cpuid; + struct vcpu_msrs *msrs = v->arch.msrs; if ( !cp->feat.mpx ) return false; @@ -347,7 +348,8 @@ bool hvm_set_guest_bndcfgs(struct vcpu *v, uint64_t val) /* nothing, best effort only */; } - hvm_funcs.set_guest_bndcfgs(v, val); + msrs->bndcfgs.raw = val; + hvm_funcs.set_guest_bndcfgs(v, msrs->bndcfgs.raw); return true; } @@ -355,12 +357,22 @@ bool hvm_set_guest_bndcfgs(struct vcpu *v, uint64_t val) bool hvm_get_guest_bndcfgs(struct vcpu *v, uint64_t *val) { const struct cpuid_policy *cp = v->domain->arch.cpuid; + struct vcpu_msrs *msrs = v->arch.msrs; if ( !cp->feat.mpx ) return false; - ASSERT(hvm_funcs.get_guest_bndcfgs); - *val = hvm_funcs.get_guest_bndcfgs(v); + /* + * The value only need be read in current context as a context + * switch will save the value into msrs->bndcfgs. + */ + if ( v == current ) + { + ASSERT(hvm_funcs.get_guest_bndcfgs); + msrs->bndcfgs.raw = hvm_funcs.get_guest_bndcfgs(v); + } + + *val = msrs->bndcfgs.raw; return true; } diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index 4bfabe8d0e..7dba92da45 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -497,6 +497,9 @@ static void vmx_restore_host_msrs(void) static void vmx_save_guest_msrs(struct vcpu *v) { + if ( cpu_has_mpx && cpu_has_vmx_mpx ) + __vmread(GUEST_BNDCFGS, &v->arch.msrs->bndcfgs.raw); + /* * We cannot cache SHADOW_GS_BASE while the VCPU runs, as it can * be updated at any time via SWAPGS, which we cannot trap. diff --git a/xen/include/asm-x86/msr.h b/xen/include/asm-x86/msr.h index ad8688a61f..c69ce56963 100644 --- a/xen/include/asm-x86/msr.h +++ b/xen/include/asm-x86/msr.h @@ -305,6 +305,11 @@ struct vcpu_msrs * values here may be stale in current context. */ uint32_t dr_mask[4]; + + /* 0x00000d90 - MSR_IA32_BNDCFGS */ + struct { + uint64_t raw; + } bndcfgs; }; void init_guest_msr_policy(void); -- 2.20.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |