}
}
-void vioapic_update_EOI(struct domain *d, int vector)
+void vioapic_update_EOI(struct domain *d, u8 vector)
{
struct hvm_hw_vioapic *vioapic = domain_vioapic(d);
struct hvm_irq *hvm_irq = &d->arch.hvm_domain.irq;
if ( hvm_funcs.handle_eoi )
hvm_funcs.handle_eoi(vector);
- if ( vlapic_test_and_clear_vector(vector, &vlapic->regs->data[APIC_TMR]) )
- vioapic_update_EOI(vlapic_domain(vlapic), vector);
-
- hvm_dpci_msi_eoi(current->domain, vector);
+ vlapic_handle_EOI(vlapic, vector);
}
-void vlapic_handle_EOI_induced_exit(struct vlapic *vlapic, int vector)
+void vlapic_handle_EOI(struct vlapic *vlapic, u8 vector)
{
+ struct domain *d = vlapic_domain(vlapic);
+
if ( vlapic_test_and_clear_vector(vector, &vlapic->regs->data[APIC_TMR]) )
- vioapic_update_EOI(vlapic_domain(vlapic), vector);
+ vioapic_update_EOI(d, vector);
- hvm_dpci_msi_eoi(current->domain, vector);
+ hvm_dpci_msi_eoi(d, vector);
}
static bool_t is_multicast_dest(struct vlapic *vlapic, unsigned int short_hand,
return vlapic_apicv_write(current, exit_qualification & 0xfff);
}
-/*
- * When "Virtual Interrupt Delivery" is enabled, this function is used
- * to handle EOI-induced VM exit
- */
-void vmx_handle_EOI_induced_exit(struct vlapic *vlapic, int vector)
-{
- ASSERT(cpu_has_vmx_virtual_intr_delivery);
-
- vlapic_handle_EOI_induced_exit(vlapic, vector);
-}
-
void vmx_vmexit_handler(struct cpu_user_regs *regs)
{
unsigned long exit_qualification, exit_reason, idtv_info, intr_info = 0;
break;
case EXIT_REASON_EOI_INDUCED:
- {
- int vector;
-
__vmread(EXIT_QUALIFICATION, &exit_qualification);
- vector = exit_qualification & 0xff;
- vmx_handle_EOI_induced_exit(vcpu_vlapic(v), vector);
+ ASSERT(cpu_has_vmx_virtual_intr_delivery);
+
+ vlapic_handle_EOI(vcpu_vlapic(v), exit_qualification);
break;
- }
case EXIT_REASON_IO_INSTRUCTION:
__vmread(EXIT_QUALIFICATION, &exit_qualification);
void vioapic_deinit(struct domain *d);
void vioapic_reset(struct domain *d);
void vioapic_irq_positive_edge(struct domain *d, unsigned int irq);
-void vioapic_update_EOI(struct domain *d, int vector);
+void vioapic_update_EOI(struct domain *d, u8 vector);
#endif /* __ASM_X86_HVM_VIOAPIC_H__ */
void vlapic_adjust_i8259_target(struct domain *d);
void vlapic_EOI_set(struct vlapic *vlapic);
-void vlapic_handle_EOI_induced_exit(struct vlapic *vlapic, int vector);
+void vlapic_handle_EOI(struct vlapic *vlapic, u8 vector);
void vlapic_ipi(struct vlapic *vlapic, uint32_t icr_low, uint32_t icr_high);