Commit 2af9194d authored by Joerg Roedel's avatar Joerg Roedel Committed by Avi Kivity

KVM: SVM: add helper functions for global interrupt flag

This patch makes the code easier to read when it comes to setting,
clearing and checking the status of the virtualized global
interrupt flag for the VCPU.
Signed-off-by: default avatarJoerg Roedel <joerg.roedel@amd.com>
Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
parent 256cd2ef
...@@ -129,6 +129,21 @@ static inline bool is_nested(struct vcpu_svm *svm) ...@@ -129,6 +129,21 @@ static inline bool is_nested(struct vcpu_svm *svm)
return svm->nested_vmcb; return svm->nested_vmcb;
} }
static inline void enable_gif(struct vcpu_svm *svm)
{
svm->vcpu.arch.hflags |= HF_GIF_MASK;
}
static inline void disable_gif(struct vcpu_svm *svm)
{
svm->vcpu.arch.hflags &= ~HF_GIF_MASK;
}
static inline bool gif_set(struct vcpu_svm *svm)
{
return !!(svm->vcpu.arch.hflags & HF_GIF_MASK);
}
static unsigned long iopm_base; static unsigned long iopm_base;
struct kvm_ldttss_desc { struct kvm_ldttss_desc {
...@@ -621,7 +636,9 @@ static void init_vmcb(struct vcpu_svm *svm) ...@@ -621,7 +636,9 @@ static void init_vmcb(struct vcpu_svm *svm)
force_new_asid(&svm->vcpu); force_new_asid(&svm->vcpu);
svm->nested_vmcb = 0; svm->nested_vmcb = 0;
svm->vcpu.arch.hflags = HF_GIF_MASK; svm->vcpu.arch.hflags = 0;
enable_gif(svm);
} }
static int svm_vcpu_reset(struct kvm_vcpu *vcpu) static int svm_vcpu_reset(struct kvm_vcpu *vcpu)
...@@ -1629,7 +1646,7 @@ static int nested_svm_vmexit_real(struct vcpu_svm *svm, void *arg1, ...@@ -1629,7 +1646,7 @@ static int nested_svm_vmexit_real(struct vcpu_svm *svm, void *arg1,
svm->vmcb->save.cpl = 0; svm->vmcb->save.cpl = 0;
svm->vmcb->control.exit_int_info = 0; svm->vmcb->control.exit_int_info = 0;
svm->vcpu.arch.hflags &= ~HF_GIF_MASK; disable_gif(svm);
/* Exit nested SVM mode */ /* Exit nested SVM mode */
svm->nested_vmcb = 0; svm->nested_vmcb = 0;
...@@ -1761,7 +1778,7 @@ static int nested_svm_vmrun(struct vcpu_svm *svm, void *arg1, ...@@ -1761,7 +1778,7 @@ static int nested_svm_vmrun(struct vcpu_svm *svm, void *arg1,
svm->vmcb->control.event_inj = nested_vmcb->control.event_inj; svm->vmcb->control.event_inj = nested_vmcb->control.event_inj;
svm->vmcb->control.event_inj_err = nested_vmcb->control.event_inj_err; svm->vmcb->control.event_inj_err = nested_vmcb->control.event_inj_err;
svm->vcpu.arch.hflags |= HF_GIF_MASK; enable_gif(svm);
return 0; return 0;
} }
...@@ -1850,7 +1867,7 @@ static int stgi_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) ...@@ -1850,7 +1867,7 @@ static int stgi_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run)
svm->next_rip = kvm_rip_read(&svm->vcpu) + 3; svm->next_rip = kvm_rip_read(&svm->vcpu) + 3;
skip_emulated_instruction(&svm->vcpu); skip_emulated_instruction(&svm->vcpu);
svm->vcpu.arch.hflags |= HF_GIF_MASK; enable_gif(svm);
return 1; return 1;
} }
...@@ -1863,7 +1880,7 @@ static int clgi_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) ...@@ -1863,7 +1880,7 @@ static int clgi_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run)
svm->next_rip = kvm_rip_read(&svm->vcpu) + 3; svm->next_rip = kvm_rip_read(&svm->vcpu) + 3;
skip_emulated_instruction(&svm->vcpu); skip_emulated_instruction(&svm->vcpu);
svm->vcpu.arch.hflags &= ~HF_GIF_MASK; disable_gif(svm);
/* After a CLGI no interrupts should come */ /* After a CLGI no interrupts should come */
svm_clear_vintr(svm); svm_clear_vintr(svm);
...@@ -2352,7 +2369,7 @@ static void svm_set_irq(struct kvm_vcpu *vcpu) ...@@ -2352,7 +2369,7 @@ static void svm_set_irq(struct kvm_vcpu *vcpu)
{ {
struct vcpu_svm *svm = to_svm(vcpu); struct vcpu_svm *svm = to_svm(vcpu);
BUG_ON(!(svm->vcpu.arch.hflags & HF_GIF_MASK)); BUG_ON(!(gif_set(svm)));
svm->vmcb->control.event_inj = vcpu->arch.interrupt.nr | svm->vmcb->control.event_inj = vcpu->arch.interrupt.nr |
SVM_EVTINJ_VALID | SVM_EVTINJ_TYPE_INTR; SVM_EVTINJ_VALID | SVM_EVTINJ_TYPE_INTR;
...@@ -2383,7 +2400,7 @@ static int svm_interrupt_allowed(struct kvm_vcpu *vcpu) ...@@ -2383,7 +2400,7 @@ static int svm_interrupt_allowed(struct kvm_vcpu *vcpu)
struct vmcb *vmcb = svm->vmcb; struct vmcb *vmcb = svm->vmcb;
return (vmcb->save.rflags & X86_EFLAGS_IF) && return (vmcb->save.rflags & X86_EFLAGS_IF) &&
!(vmcb->control.int_state & SVM_INTERRUPT_SHADOW_MASK) && !(vmcb->control.int_state & SVM_INTERRUPT_SHADOW_MASK) &&
(svm->vcpu.arch.hflags & HF_GIF_MASK) && gif_set(svm) &&
!is_nested(svm); !is_nested(svm);
} }
...@@ -2398,7 +2415,7 @@ static void enable_irq_window(struct kvm_vcpu *vcpu) ...@@ -2398,7 +2415,7 @@ static void enable_irq_window(struct kvm_vcpu *vcpu)
* GIF becomes 1, because that's a separate STGI/VMRUN intercept. * GIF becomes 1, because that's a separate STGI/VMRUN intercept.
* The next time we get that intercept, this function will be * The next time we get that intercept, this function will be
* called again though and we'll get the vintr intercept. */ * called again though and we'll get the vintr intercept. */
if (svm->vcpu.arch.hflags & HF_GIF_MASK) { if (gif_set(svm)) {
svm_set_vintr(svm); svm_set_vintr(svm);
svm_inject_irq(svm, 0x0); svm_inject_irq(svm, 0x0);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment