@@ -663,26 +663,29 @@ static void activate_physical_ioapic(struct vm *vm,
663
663
{
664
664
union ioapic_rte rte ;
665
665
uint32_t phys_irq = entry -> allocated_pirq ;
666
+ uint32_t intr_mask ;
666
667
bool is_lvl_trigger = false;
667
668
668
669
/* disable interrupt */
669
670
GSI_MASK_IRQ (phys_irq );
670
671
671
672
/* build physical IOAPIC RTE */
672
673
rte = ptdev_build_physical_rte (vm , entry );
673
-
674
- /* set rte entry */
675
- rte .full |= IOAPIC_RTE_INTMSET ;
676
- ioapic_set_rte (phys_irq , rte );
674
+ intr_mask = (rte .full & IOAPIC_RTE_INTMASK );
677
675
678
676
/* update irq trigger mode according to info in guest */
679
677
if ((rte .full & IOAPIC_RTE_TRGRMOD ) == IOAPIC_RTE_TRGRLVL ) {
680
678
is_lvl_trigger = true;
681
679
}
682
680
set_irq_trigger_mode (phys_irq , is_lvl_trigger );
683
681
684
- /* enable interrupt */
685
- GSI_UNMASK_IRQ (phys_irq );
682
+ /* set rte entry when masked */
683
+ rte .full |= IOAPIC_RTE_INTMSET ;
684
+ ioapic_set_rte (phys_irq , rte );
685
+
686
+ if (intr_mask == IOAPIC_RTE_INTMCLR ) {
687
+ GSI_UNMASK_IRQ (phys_irq );
688
+ }
686
689
}
687
690
688
691
/* Main entry for PCI/Legacy device assignment with INTx, calling from vIOAPIC
@@ -691,7 +694,6 @@ static void activate_physical_ioapic(struct vm *vm,
691
694
int ptdev_intx_pin_remap (struct vm * vm , struct ptdev_intx_info * info )
692
695
{
693
696
struct ptdev_remapping_info * entry ;
694
- union ioapic_rte rte ;
695
697
uint32_t phys_irq ;
696
698
uint8_t phys_pin ;
697
699
bool need_switch_vpin_src = false;
@@ -800,41 +802,7 @@ int ptdev_intx_pin_remap(struct vm *vm, struct ptdev_intx_info *info)
800
802
intx -> vpin_src = info -> vpin_src ;
801
803
intx -> virt_pin = info -> virt_pin ;
802
804
}
803
-
804
- if (is_entry_active (entry )
805
- && (intx -> vpin_src
806
- == PTDEV_VPIN_IOAPIC )) {
807
- vioapic_get_rte (vm , intx -> virt_pin , & rte );
808
- if (rte .u .lo_32 == 0x10000U ) {
809
- /* disable interrupt */
810
- GSI_MASK_IRQ (phys_irq );
811
- dev_dbg (ACRN_DBG_IRQ ,
812
- "IOAPIC pin=%hhu pirq=%u deassigned " ,
813
- phys_pin , phys_irq );
814
- dev_dbg (ACRN_DBG_IRQ , "from vm%d vIOAPIC vpin=%d" ,
815
- entry -> vm -> vm_id ,
816
- intx -> virt_pin );
817
- goto END ;
818
- } else {
819
- /*update rte*/
820
- activate_physical_ioapic (vm , entry );
821
- }
822
- } else if (is_entry_active (entry )
823
- && (intx -> vpin_src == PTDEV_VPIN_PIC )) {
824
- /* only update here
825
- * deactive vPIC entry when IOAPIC take it over
826
- */
827
- activate_physical_ioapic (vm , entry );
828
- } else {
829
- activate_physical_ioapic (vm , entry );
830
-
831
- dev_dbg (ACRN_DBG_IRQ ,
832
- "IOAPIC pin=%hhu pirq=%u assigned to vm%d %s vpin=%d" ,
833
- phys_pin , phys_irq , entry -> vm -> vm_id ,
834
- intx -> vpin_src == PTDEV_VPIN_PIC ?
835
- "vPIC" : "vIOAPIC" ,
836
- intx -> virt_pin );
837
- }
805
+ activate_physical_ioapic (vm , entry );
838
806
END :
839
807
return 0 ;
840
808
}
0 commit comments