VirtualBox

Changeset 55693 in vbox


Ignore:
Timestamp:
May 6, 2015 2:00:15 PM (10 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
100096
Message:

DevVGA-SVGA.cpp: Fixed for cubebench hang. The FIFO must take the lock when working over the IRQ state, just like the EMT (implicitly) does.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.cpp

    r55493 r55693  
    12401240
    12411241        /* Irq pending after the above change? */
    1242         if (pThis->svga.u32IrqMask & pThis->svga.u32IrqStatus)
     1242        if (pThis->svga.u32IrqStatus & u32)
    12431243        {
    12441244            Log(("SVGA_REG_IRQMASK: Trigger interrupt with status %x\n", pThis->svga.u32IrqStatus));
     
    14981498        /* Clear the irq in case all events have been cleared. */
    14991499        if (!(pThis->svga.u32IrqStatus & pThis->svga.u32IrqMask))
     1500        {
     1501            Log(("vmsvgaIOWrite SVGA_IRQSTATUS_PORT: clearing IRQ\n"));
    15001502            PDMDevHlpPCISetIrqNoWait(pDevIns, 0, 0);
     1503        }
    15011504        break;
    15021505    }
     
    31943197            STAM_REL_COUNTER_INC(&pSVGAState->StatFifoCommands);
    31953198
    3196             /* FIFO progress might trigger an interrupt. */
    3197             if (pThis->svga.u32IrqMask & SVGA_IRQFLAG_FIFO_PROGRESS)
     3199            /*
     3200             * Raise IRQ if required.  Must enter the critical section here
     3201             * before making final decisions here, otherwise cubebench and
     3202             * others may end up waiting forever.
     3203             */
     3204            if (   u32IrqStatus
     3205                || (pThis->svga.u32IrqMask & SVGA_IRQFLAG_FIFO_PROGRESS))
    31983206            {
    3199                 Log(("vmsvgaFIFOLoop: fifo progress irq\n"));
    3200                 u32IrqStatus |= SVGA_IRQFLAG_FIFO_PROGRESS;
    3201             }
    3202 
    3203             /* Irq pending? */
    3204             if (pThis->svga.u32IrqMask & u32IrqStatus)
    3205             {
    3206                 Log(("vmsvgaFIFOLoop: Trigger interrupt with status %x\n", u32IrqStatus));
    3207                 ASMAtomicOrU32(&pThis->svga.u32IrqStatus, u32IrqStatus);
    3208                 PDMDevHlpPCISetIrqNoWait(pDevIns, 0, 1);
     3207                PDMCritSectEnter(&pThis->CritSect, VERR_IGNORED);
     3208
     3209                /* FIFO progress might trigger an interrupt. */
     3210                if (pThis->svga.u32IrqMask & SVGA_IRQFLAG_FIFO_PROGRESS)
     3211                {
     3212                    Log(("vmsvgaFIFOLoop: fifo progress irq\n"));
     3213                    u32IrqStatus |= SVGA_IRQFLAG_FIFO_PROGRESS;
     3214                }
     3215
     3216                /* Unmasked IRQ pending? */
     3217                if (pThis->svga.u32IrqMask & u32IrqStatus)
     3218                {
     3219                    Log(("vmsvgaFIFOLoop: Trigger interrupt with status %x\n", u32IrqStatus));
     3220                    ASMAtomicOrU32(&pThis->svga.u32IrqStatus, u32IrqStatus);
     3221                    PDMDevHlpPCISetIrq(pDevIns, 0, 1);
     3222                }
     3223
     3224                PDMCritSectLeave(&pThis->CritSect);
    32093225            }
    32103226        }
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