Changeset 90307 in vbox
- Timestamp:
- Jul 23, 2021 1:56:30 PM (4 years ago)
- svn:sync-xref-src-repo-rev:
- 145863
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/PC/DevIoApic.cpp
r90298 r90307 861 861 { 862 862 uint64_t const u64Rte = pThis->au64RedirTable[idxRte]; 863 /** @todo r=bird: bugref:10073: Ignore edge triggered entries here since 864 * the APIC will only call us for those? Not doing so confuses ended up 865 * with spurious HPET/RTC IRQs in SMP linux because of it sharing the vector 866 * with a level-triggered IRQ (like vboxguest) delivered on a different CPU. 867 * Alternatively, make the call specify the APIC number of use that in the 868 * filter too/instead. */ 863 869 if (IOAPIC_RTE_GET_VECTOR(u64Rte) == u8Vector) 864 870 { … … 896 902 { 897 903 RT_NOREF(uBusDevFn); /** @todo r=ramshankar: Remove this argument if it's also unnecessary with Intel IOMMU. */ 898 #define IOAPIC_ASSERT_IRQ(a_uBusDevFn, a_idxRte, a_PinMask ) do { \899 pThis->au32TagSrc[(a_idxRte)] = !pThis->au32TagSrc[(a_idxRte)] ? uTagSrc : RT_BIT_32(31); \904 #define IOAPIC_ASSERT_IRQ(a_uBusDevFn, a_idxRte, a_PinMask, a_fForceTag) do { \ 905 pThis->au32TagSrc[(a_idxRte)] = (a_fForceTag) || !pThis->au32TagSrc[(a_idxRte)] ? uTagSrc : RT_BIT_32(31); \ 900 906 pThis->uIrr |= a_PinMask; \ 901 907 ioapicSignalIntrForRte(pDevIns, pThis, pThisCC, (a_idxRte)); \ … … 928 934 { 929 935 pThis->uIrr &= ~uPinMask; 936 pThis->au32TagSrc[idxRte] = 0; 930 937 IOAPIC_UNLOCK(pDevIns, pThis, pThisCC); 931 938 return; 932 939 } 933 940 934 bool const fFlipFlop = ((iLevel & PDM_IRQ_LEVEL_FLIP_FLOP) == PDM_IRQ_LEVEL_FLIP_FLOP); 935 uint32_t const uPrevIrr = pThis->uIrr & uPinMask; 941 bool const fFlipFlop = ((iLevel & PDM_IRQ_LEVEL_FLIP_FLOP) == PDM_IRQ_LEVEL_FLIP_FLOP); 936 942 if (!fFlipFlop) 937 943 { 944 uint32_t const uPrevIrr = pThis->uIrr & uPinMask; 938 945 if (u8TriggerMode == IOAPIC_RTE_TRIGGER_MODE_EDGE) 939 946 { … … 943 950 */ 944 951 if (!uPrevIrr) 945 IOAPIC_ASSERT_IRQ(uBusDevFn, idxRte, uPinMask );952 IOAPIC_ASSERT_IRQ(uBusDevFn, idxRte, uPinMask, false); 946 953 else 947 954 { … … 967 974 } 968 975 969 IOAPIC_ASSERT_IRQ(uBusDevFn, idxRte, uPinMask );976 IOAPIC_ASSERT_IRQ(uBusDevFn, idxRte, uPinMask, false); 970 977 } 971 978 } … … 978 985 * hence just the assert is done. 979 986 */ 980 IOAPIC_ASSERT_IRQ(uBusDevFn, idxRte, uPinMask );987 IOAPIC_ASSERT_IRQ(uBusDevFn, idxRte, uPinMask, true); 981 988 } 982 989 … … 994 1001 PIOAPICCC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PIOAPICCC); 995 1002 PIOAPIC pThis = PDMDEVINS_2_DATA(pDevIns, PIOAPIC); 996 LogFlow(("IOAPIC: ioapicSendMsi: uBusDevFn=%#x Addr=%#RX64 Data=%#RX32\n", uBusDevFn, pMsi->Addr.u64, pMsi->Data.u32)); 1003 LogFlow(("IOAPIC: ioapicSendMsi: uBusDevFn=%#x Addr=%#RX64 Data=%#RX32 uTagSrc=%#x\n", 1004 uBusDevFn, pMsi->Addr.u64, pMsi->Data.u32, uTagSrc)); 997 1005 998 1006 XAPICINTR ApicIntr;
Note:
See TracChangeset
for help on using the changeset viewer.