|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v1 16/28] x86/hvm: move VINTR disable to svm_clear_intr_window()
From: Denis Mukhin <dmukhin@xxxxxxxx>
Wrap duplicate code for disabling VINTR into svm_clear_intr_window().
Not a functional change.
Signed-off-by: Denis Mukhin <dmukhin@xxxxxxxx>
---
xen/arch/x86/hvm/svm/intr.c | 13 +++++++++++++
xen/arch/x86/hvm/svm/nestedsvm.c | 9 +--------
xen/arch/x86/hvm/svm/svm.c | 11 +----------
xen/arch/x86/hvm/svm/svm.h | 2 ++
4 files changed, 17 insertions(+), 18 deletions(-)
diff --git a/xen/arch/x86/hvm/svm/intr.c b/xen/arch/x86/hvm/svm/intr.c
index 2224f1834741..1d39f25e5209 100644
--- a/xen/arch/x86/hvm/svm/intr.c
+++ b/xen/arch/x86/hvm/svm/intr.c
@@ -238,6 +238,19 @@ void asmlinkage svm_intr_assist(void)
svm_enable_intr_window(v, intack);
}
+void svm_clear_intr_window(struct vcpu *v)
+{
+ struct vmcb_struct *vmcb = v->arch.hvm.svm.vmcb;
+ uint32_t general1_intercepts = vmcb_get_general1_intercepts(vmcb);
+ vintr_t intr = vmcb_get_vintr(vmcb);
+
+ intr.fields.irq = 0;
+ general1_intercepts &= ~GENERAL1_INTERCEPT_VINTR;
+
+ vmcb_set_vintr(vmcb, intr);
+ vmcb_set_general1_intercepts(vmcb, general1_intercepts);
+}
+
/*
* Local variables:
* mode: C
diff --git a/xen/arch/x86/hvm/svm/nestedsvm.c b/xen/arch/x86/hvm/svm/nestedsvm.c
index d970869cfd96..c7fde48d5281 100644
--- a/xen/arch/x86/hvm/svm/nestedsvm.c
+++ b/xen/arch/x86/hvm/svm/nestedsvm.c
@@ -1491,10 +1491,7 @@ void svm_vmexit_do_stgi(struct cpu_user_regs *regs,
struct vcpu *v)
void svm_vmexit_do_clgi(struct cpu_user_regs *regs, struct vcpu *v)
{
- struct vmcb_struct *vmcb = v->arch.hvm.svm.vmcb;
unsigned int inst_len;
- uint32_t general1_intercepts = vmcb_get_general1_intercepts(vmcb);
- vintr_t intr;
if ( !nsvm_efer_svm_enabled(v) )
{
@@ -1508,11 +1505,7 @@ void svm_vmexit_do_clgi(struct cpu_user_regs *regs,
struct vcpu *v)
vcpu_nestedsvm(v).ns_gif = 0;
/* After a CLGI no interrupts should come */
- intr = vmcb_get_vintr(vmcb);
- intr.fields.irq = 0;
- general1_intercepts &= ~GENERAL1_INTERCEPT_VINTR;
- vmcb_set_vintr(vmcb, intr);
- vmcb_set_general1_intercepts(vmcb, general1_intercepts);
+ svm_clear_intr_window(v);
__update_guest_eip(regs, inst_len);
}
diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c
index 14a86ca4ff8f..d1a95e441f03 100644
--- a/xen/arch/x86/hvm/svm/svm.c
+++ b/xen/arch/x86/hvm/svm/svm.c
@@ -2813,17 +2813,8 @@ void asmlinkage svm_vmexit_handler(void)
break;
case VMEXIT_VINTR:
- {
- u32 general1_intercepts = vmcb_get_general1_intercepts(vmcb);
- intr = vmcb_get_vintr(vmcb);
-
- intr.fields.irq = 0;
- general1_intercepts &= ~GENERAL1_INTERCEPT_VINTR;
-
- vmcb_set_vintr(vmcb, intr);
- vmcb_set_general1_intercepts(vmcb, general1_intercepts);
+ svm_clear_intr_window(v);
break;
- }
case VMEXIT_INVD:
case VMEXIT_WBINVD:
diff --git a/xen/arch/x86/hvm/svm/svm.h b/xen/arch/x86/hvm/svm/svm.h
index cfa411ad5ae1..0dd5ee78fce3 100644
--- a/xen/arch/x86/hvm/svm/svm.h
+++ b/xen/arch/x86/hvm/svm/svm.h
@@ -21,6 +21,8 @@ void svm_asid_handle_vmrun(void);
unsigned long *svm_msrbit(unsigned long *msr_bitmap, uint32_t msr);
void __update_guest_eip(struct cpu_user_regs *regs, unsigned int inst_len);
+void svm_clear_intr_window(struct vcpu *v);
+
static inline void svm_vmload_pa(paddr_t vmcb)
{
asm volatile ( "vmload" :: "a" (vmcb) : "memory" );
--
2.55.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |