VirtualBox

Changeset 90307 in vbox


Ignore:
Timestamp:
Jul 23, 2021 1:56:30 PM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
145863
Message:

DevIoApic: IRQ tagging fixes. Todo for EIO. bugref:10073 oem2tickeref:43

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/PC/DevIoApic.cpp

    r90298 r90307  
    861861    {
    862862        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. */
    863869        if (IOAPIC_RTE_GET_VECTOR(u64Rte) == u8Vector)
    864870        {
     
    896902{
    897903    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); \
    900906        pThis->uIrr |= a_PinMask; \
    901907        ioapicSignalIntrForRte(pDevIns, pThis, pThisCC, (a_idxRte)); \
     
    928934        {
    929935            pThis->uIrr &= ~uPinMask;
     936            pThis->au32TagSrc[idxRte] = 0;
    930937            IOAPIC_UNLOCK(pDevIns, pThis, pThisCC);
    931938            return;
    932939        }
    933940
    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);
    936942        if (!fFlipFlop)
    937943        {
     944            uint32_t const uPrevIrr = pThis->uIrr & uPinMask;
    938945            if (u8TriggerMode == IOAPIC_RTE_TRIGGER_MODE_EDGE)
    939946            {
     
    943950                 */
    944951                if (!uPrevIrr)
    945                     IOAPIC_ASSERT_IRQ(uBusDevFn, idxRte, uPinMask);
     952                    IOAPIC_ASSERT_IRQ(uBusDevFn, idxRte, uPinMask, false);
    946953                else
    947954                {
     
    967974                }
    968975
    969                 IOAPIC_ASSERT_IRQ(uBusDevFn, idxRte, uPinMask);
     976                IOAPIC_ASSERT_IRQ(uBusDevFn, idxRte, uPinMask, false);
    970977            }
    971978        }
     
    978985             * hence just the assert is done.
    979986             */
    980             IOAPIC_ASSERT_IRQ(uBusDevFn, idxRte, uPinMask);
     987            IOAPIC_ASSERT_IRQ(uBusDevFn, idxRte, uPinMask, true);
    981988        }
    982989
     
    9941001    PIOAPICCC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PIOAPICCC);
    9951002    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));
    9971005
    9981006    XAPICINTR ApicIntr;
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette