VirtualBox

Changeset 2927 in vbox for trunk/src/VBox/Devices


Ignore:
Timestamp:
May 30, 2007 7:58:09 AM (18 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
21604
Message:

Clear the interrupt FF when a pending interrupt is masked by a TRP update.

File:
1 edited

Legend:

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

    r2922 r2927  
    215215    STAMCOUNTER     StatMMIOWriteGC;
    216216    STAMCOUNTER     StatMMIOWriteHC;
     217    STAMCOUNTER     StatClearedActiveIrq;
    217218# endif
    218219#endif /* VBOX */
     
    266267static void apic_init_ipi(APICState *s);
    267268static void apic_set_irq(APICState *s, int vector_num, int trigger_mode);
    268 static void apic_update_irq(APICState *s);
     269static bool apic_update_irq(APICState *s);
    269270
    270271#ifdef VBOX
     
    284285PDMBOTHCBDECL(int)  ioapicMMIOWrite(PPDMDEVINS pDevIns, void *pvUser, RTGCPHYS GCPhysAddr, void *pv, unsigned cb);
    285286PDMBOTHCBDECL(void) ioapicSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel);
     287
     288static void apic_update_tpr(APICState *s, uint32_t val);
    286289__END_DECLS
    287290#endif /* VBOX */
     
    453456    APICState *s = PDMINS2DATA(pDevIns, APICState *);
    454457    LogFlow(("apicSetTPR: val=%#x (trp %#x -> %#x)\n", val, s->tpr, (val & 0x0f) << 4));
    455     s->tpr = (val & 0x0f) << 4;
    456     apic_update_irq(s);
     458    apic_update_tpr(s, (val & 0x0f) << 4);
    457459}
    458460
     
    520522
    521523/* signal the CPU if an irq is pending */
    522 static void apic_update_irq(APICState *s)
     524static bool apic_update_irq(APICState *s)
    523525{
    524526    int irrv, ppr;
     
    528530        /* Clear any pending APIC interrupt action flag. */
    529531        s->CTXALLSUFF(pApicHlp)->pfnClearInterruptFF(s->CTXSUFF(pDevIns));
    530         return;
     532        return false;
    531533    }
    532534#else
    533         return;
     535        return false;
    534536#endif /* VBOX */
    535537    irrv = get_highest_priority_int(s->irr);
    536538    if (irrv < 0)
    537         return;
     539        return false;
    538540    ppr = apic_get_ppr(s);
    539541    if (ppr && (irrv & 0xf0) <= (ppr & 0xf0))
    540         return;
     542        return false;
    541543#ifndef VBOX
    542544    cpu_interrupt(s->cpu_env, CPU_INTERRUPT_HARD);
    543545#else
    544546    s->CTXALLSUFF(pApicHlp)->pfnSetInterruptFF(s->CTXSUFF(pDevIns));
    545 #endif
    546 }
     547    return true;
     548#endif
     549}
     550
     551#ifdef VBOX
     552static void apic_update_tpr(APICState *s, uint32_t val)
     553{
     554    bool fIrqIsActive = false;
     555    bool fIrqWasActive = false;
     556
     557    fIrqWasActive = apic_update_irq(s);
     558    s->tpr        = val;
     559    fIrqIsActive  = apic_update_irq(s);
     560
     561    /* If an interrupt is pending and now masked, then clear the FF flag. */
     562    if (fIrqWasActive && !fIrqIsActive)
     563    {
     564        Log(("apic_update_tpr: deactivate interrupt that was masked by the TPR update (%x)\n", val));
     565        STAM_COUNTER_INC(&s->StatClearedActiveIrq);
     566        s->CTXALLSUFF(pApicHlp)->pfnClearInterruptFF(s->CTXSUFF(pDevIns));
     567    }
     568}
     569#endif
    547570
    548571static void apic_set_irq(APICState *s, int vector_num, int trigger_mode)
     
    9881011        break;
    9891012    case 0x08:
     1013#ifdef VBOX
     1014        apic_update_tpr(s, val);
     1015#else
    9901016        s->tpr = val;
    9911017        apic_update_irq(s);
     1018#endif
    9921019        break;
    9931020    case 0x09:
     
    17691796    PDMDevHlpSTAMRegister(pDevIns, &pData->StatMMIOWriteGC,    STAMTYPE_COUNTER,  "/PDM/APIC/MMIOWriteGC",  STAMUNIT_OCCURENCES, "Number of APIC MMIO writes in GC.");
    17701797    PDMDevHlpSTAMRegister(pDevIns, &pData->StatMMIOWriteHC,    STAMTYPE_COUNTER,  "/PDM/APIC/MMIOWriteHC",  STAMUNIT_OCCURENCES, "Number of APIC MMIO writes in HC.");
     1798    PDMDevHlpSTAMRegister(pDevIns, &pData->StatClearedActiveIrq, STAMTYPE_COUNTER,  "/PDM/APIC/Masked/ActiveIRQ",  STAMUNIT_OCCURENCES, "Number of cleared irqs.");
    17711799#endif
    17721800
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