|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 2/2] 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>
---
xen/arch/x86/hvm/svm/nestedsvm.c | 7 ++++++-
xen/arch/x86/hvm/svm/svm.c | 1 +
xen/arch/x86/hvm/svm/vmcb.c | 12 ++++++++++++
3 files changed, 19 insertions(+), 1 deletion(-)
diff --git a/xen/arch/x86/hvm/svm/nestedsvm.c b/xen/arch/x86/hvm/svm/nestedsvm.c
index 1de896e456..0705cf9cb8 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 b9cf423fd9..6b7a462fcb 100644
--- a/xen/arch/x86/hvm/svm/svm.c
+++ b/xen/arch/x86/hvm/svm/svm.c
@@ -1669,6 +1669,7 @@ const struct hvm_function_table * __init start_svm(void)
P(cpu_has_svm_nrips, "Next-RIP Saved on #VMEXIT");
P(cpu_has_svm_cleanbits, "VMCB Clean Bits");
P(cpu_has_svm_decode, "DecodeAssists");
+ 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 997e7597e0..ce656dcbce 100644
--- a/xen/arch/x86/hvm/svm/vmcb.c
+++ b/xen/arch/x86/hvm/svm/vmcb.c
@@ -206,6 +206,18 @@ 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;
+ }
+ else {
+ vmcb->_vintr.fields.vgif_enable = 0;
+ }
+
if ( cpu_has_pause_filter )
{
vmcb->_pause_filter_count = SVM_PAUSEFILTER_INIT;
--
2.11.0
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |