[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] x86/svm: Add virtual GIF support
commit 4cd0fad64590ff8cfce6fa549cee15f8b07b664c Author: Brian Woods <brian.woods@xxxxxxx> AuthorDate: Thu Nov 16 16:11:15 2017 -0600 Commit: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> CommitDate: Fri Dec 1 19:03:28 2017 +0000 x86/svm: Add virtual GIF support This patch detects and enables Virtual GIF if available. This allows a nested hypervisor to perform STGIs and CLGIs without having to be intercepted by host hypervisor. Signed-off-by: Brian Woods <brian.woods@xxxxxxx> Reviewed-by: Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx> Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- xen/arch/x86/hvm/svm/nestedsvm.c | 7 ++++++- xen/arch/x86/hvm/svm/svm.c | 1 + xen/arch/x86/hvm/svm/vmcb.c | 9 +++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/xen/arch/x86/hvm/svm/nestedsvm.c b/xen/arch/x86/hvm/svm/nestedsvm.c index 5513f7a..b6f6449 100644 --- a/xen/arch/x86/hvm/svm/nestedsvm.c +++ b/xen/arch/x86/hvm/svm/nestedsvm.c @@ -1597,8 +1597,13 @@ bool_t nestedsvm_gif_isset(struct vcpu *v) { struct nestedsvm *svm = &vcpu_nestedsvm(v); + struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb; - return (!!svm->ns_gif); + /* get the vmcb gif value if using vgif */ + if ( vmcb->_vintr.fields.vgif_enable ) + return vmcb->_vintr.fields.vgif; + else + return svm->ns_gif; } void svm_vmexit_do_stgi(struct cpu_user_regs *regs, struct vcpu *v) diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c index 60b1288..2e62b9b 100644 --- a/xen/arch/x86/hvm/svm/svm.c +++ b/xen/arch/x86/hvm/svm/svm.c @@ -1670,6 +1670,7 @@ const struct hvm_function_table * __init start_svm(void) P(cpu_has_svm_cleanbits, "VMCB Clean Bits"); P(cpu_has_svm_decode, "DecodeAssists"); P(cpu_has_svm_vloadsave, "Virtual VMLOAD/VMSAVE"); + P(cpu_has_svm_vgif, "Virtual GIF"); P(cpu_has_pause_filter, "Pause-Intercept Filter"); P(cpu_has_tsc_ratio, "TSC Rate MSR"); #undef P diff --git a/xen/arch/x86/hvm/svm/vmcb.c b/xen/arch/x86/hvm/svm/vmcb.c index 2e48fdd..0e6cba5 100644 --- a/xen/arch/x86/hvm/svm/vmcb.c +++ b/xen/arch/x86/hvm/svm/vmcb.c @@ -214,6 +214,15 @@ static int construct_vmcb(struct vcpu *v) vmcb->_exception_intercepts |= (1U << TRAP_page_fault); } + /* if available, enable and configure virtual gif */ + if ( cpu_has_svm_vgif ) + { + vmcb->_vintr.fields.vgif = 1; + vmcb->_vintr.fields.vgif_enable = 1; + vmcb->_general2_intercepts &= ~GENERAL2_INTERCEPT_STGI; + vmcb->_general2_intercepts &= ~GENERAL2_INTERCEPT_CLGI; + } + if ( cpu_has_pause_filter ) { vmcb->_pause_filter_count = SVM_PAUSEFILTER_INIT; -- generated by git-patchbot for /home/xen/git/xen.git#master _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |