Changeset 2927 in vbox for trunk/src/VBox/Devices
- Timestamp:
- May 30, 2007 7:58:09 AM (18 years ago)
- svn:sync-xref-src-repo-rev:
- 21604
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/PC/DevAPIC.cpp
r2922 r2927 215 215 STAMCOUNTER StatMMIOWriteGC; 216 216 STAMCOUNTER StatMMIOWriteHC; 217 STAMCOUNTER StatClearedActiveIrq; 217 218 # endif 218 219 #endif /* VBOX */ … … 266 267 static void apic_init_ipi(APICState *s); 267 268 static void apic_set_irq(APICState *s, int vector_num, int trigger_mode); 268 static voidapic_update_irq(APICState *s);269 static bool apic_update_irq(APICState *s); 269 270 270 271 #ifdef VBOX … … 284 285 PDMBOTHCBDECL(int) ioapicMMIOWrite(PPDMDEVINS pDevIns, void *pvUser, RTGCPHYS GCPhysAddr, void *pv, unsigned cb); 285 286 PDMBOTHCBDECL(void) ioapicSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel); 287 288 static void apic_update_tpr(APICState *s, uint32_t val); 286 289 __END_DECLS 287 290 #endif /* VBOX */ … … 453 456 APICState *s = PDMINS2DATA(pDevIns, APICState *); 454 457 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); 457 459 } 458 460 … … 520 522 521 523 /* signal the CPU if an irq is pending */ 522 static voidapic_update_irq(APICState *s)524 static bool apic_update_irq(APICState *s) 523 525 { 524 526 int irrv, ppr; … … 528 530 /* Clear any pending APIC interrupt action flag. */ 529 531 s->CTXALLSUFF(pApicHlp)->pfnClearInterruptFF(s->CTXSUFF(pDevIns)); 530 return ;532 return false; 531 533 } 532 534 #else 533 return ;535 return false; 534 536 #endif /* VBOX */ 535 537 irrv = get_highest_priority_int(s->irr); 536 538 if (irrv < 0) 537 return ;539 return false; 538 540 ppr = apic_get_ppr(s); 539 541 if (ppr && (irrv & 0xf0) <= (ppr & 0xf0)) 540 return ;542 return false; 541 543 #ifndef VBOX 542 544 cpu_interrupt(s->cpu_env, CPU_INTERRUPT_HARD); 543 545 #else 544 546 s->CTXALLSUFF(pApicHlp)->pfnSetInterruptFF(s->CTXSUFF(pDevIns)); 545 #endif 546 } 547 return true; 548 #endif 549 } 550 551 #ifdef VBOX 552 static 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 547 570 548 571 static void apic_set_irq(APICState *s, int vector_num, int trigger_mode) … … 988 1011 break; 989 1012 case 0x08: 1013 #ifdef VBOX 1014 apic_update_tpr(s, val); 1015 #else 990 1016 s->tpr = val; 991 1017 apic_update_irq(s); 1018 #endif 992 1019 break; 993 1020 case 0x09: … … 1769 1796 PDMDevHlpSTAMRegister(pDevIns, &pData->StatMMIOWriteGC, STAMTYPE_COUNTER, "/PDM/APIC/MMIOWriteGC", STAMUNIT_OCCURENCES, "Number of APIC MMIO writes in GC."); 1770 1797 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."); 1771 1799 #endif 1772 1800
Note:
See TracChangeset
for help on using the changeset viewer.