Changeset 61847 in vbox
- Timestamp:
- Jun 23, 2016 12:03:01 PM (8 years ago)
- Location:
- trunk
- Files:
-
- 9 edited
-
include/VBox/err.h (modified) (1 diff)
-
src/VBox/Devices/PC/DevIOAPIC_New.cpp (modified) (14 diffs)
-
src/VBox/Devices/PC/DevIoApic.cpp (modified) (2 diffs)
-
src/VBox/Devices/testcase/tstDeviceStructSize.cpp (modified) (1 diff)
-
src/VBox/Devices/testcase/tstDeviceStructSizeRC.cpp (modified) (1 diff)
-
src/VBox/VMM/VMMAll/APICAll.cpp (modified) (25 diffs)
-
src/VBox/VMM/VMMAll/PDMAll.cpp (modified) (3 diffs)
-
src/VBox/VMM/VMMR3/APIC.cpp (modified) (1 diff)
-
src/VBox/VMM/include/APICInternal.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/err.h
r61544 r61847 2765 2765 /** Pending interrupt is masked by TPR. */ 2766 2766 #define VERR_APIC_INTR_MASKED_BY_TPR (-6701) 2767 /** APIC did not accept the interrupt. */ 2768 #define VERR_APIC_INTR_DISCARDED (-6702) 2767 2769 /** @} */ 2768 2770 -
trunk/src/VBox/Devices/PC/DevIOAPIC_New.cpp
r61845 r61847 224 224 225 225 #ifdef VBOX_WITH_STATISTICS 226 /** Number of MMIO reads in R 0. */227 STAMCOUNTER StatMmioReadR 0;226 /** Number of MMIO reads in RZ. */ 227 STAMCOUNTER StatMmioReadRZ; 228 228 /** Number of MMIO reads in R3. */ 229 229 STAMCOUNTER StatMmioReadR3; 230 /** Number of MMIO reads in RC. */ 231 STAMCOUNTER StatMmioReadRC; 232 233 /** Number of MMIO writes in R0. */ 234 STAMCOUNTER StatMmioWriteR0; 230 231 /** Number of MMIO writes in RZ. */ 232 STAMCOUNTER StatMmioWriteRZ; 235 233 /** Number of MMIO writes in R3. */ 236 234 STAMCOUNTER StatMmioWriteR3; 237 /** Number of MMIO writes in RC. */ 238 STAMCOUNTER StatMmioWriteRC; 239 240 /** Number of SetIrq calls in R0. */ 241 STAMCOUNTER StatSetIrqR0; 235 236 /** Number of SetIrq calls in RZ. */ 237 STAMCOUNTER StatSetIrqRZ; 242 238 /** Number of SetIrq calls in R3. */ 243 239 STAMCOUNTER StatSetIrqR3; 244 /** Number of SetIrq calls in RC. */ 245 STAMCOUNTER StatSetIrqRC; 246 247 /** Number of SetEoi calls in R0. */ 248 STAMCOUNTER StatSetEoiR0; 240 241 /** Number of SetEoi calls in RZ. */ 242 STAMCOUNTER StatSetEoiRZ; 249 243 /** Number of SetEoi calls in R3. */ 250 244 STAMCOUNTER StatSetEoiR3; 251 /** Number of SetEoi calls in RC. */252 STAMCOUNTER StatSetEoiRC;253 245 254 246 /** Number of redundant edge-triggered interrupts. */ … … 262 254 /** Number of returns to ring-3 due to Set RTE lock contention. */ 263 255 STAMCOUNTER StatSetRteContention; 256 /** Number of level-triggered interrupts dispatched to the local APIC(s). */ 257 STAMCOUNTER StatLevelIrqSent; 258 /** Number of EOIs received for level-triggered interrupts from the local 259 * APIC(s). */ 260 STAMCOUNTER StatEoiReceived; 264 261 #endif 265 262 } IOAPIC; … … 406 403 u32TagSrc); 407 404 /* Can't reschedule to R3. */ 408 Assert(rc == VINF_SUCCESS); 405 Assert(rc == VINF_SUCCESS || rc == VERR_APIC_INTR_DISCARDED); 406 #ifdef DEBUG_ramshankar 407 if (rc == VERR_APIC_INTR_DISCARDED) 408 AssertMsgFailed(("APIC: Interrupt discarded u8Vector=%#x (%u) u64Rte=%#RX64\n", u8Vector, u8Vector, u64Rte)); 409 #endif 409 410 410 411 /* … … 417 418 * ioapicSetIrq() callback. 418 419 */ 419 if (u8TriggerMode == IOAPIC_RTE_TRIGGER_MODE_LEVEL) 420 if ( u8TriggerMode == IOAPIC_RTE_TRIGGER_MODE_LEVEL 421 && rc == VINF_SUCCESS) 420 422 { 421 423 Assert(u8TriggerMode == IOAPIC_RTE_TRIGGER_MODE_LEVEL); 422 424 pThis->au64RedirTable[idxRte] |= IOAPIC_RTE_REMOTE_IRR; 425 STAM_COUNTER_INC(&pThis->StatLevelIrqSent); 423 426 } 424 427 } … … 479 482 uint32_t const u32RtePreserveHi = RT_HI_U32(u64Rte) & ~RT_HI_U32(IOAPIC_RTE_VALID_WRITE_MASK); 480 483 uint32_t const u32RteLo = RT_LO_U32(u64Rte); 481 uint64_t const u64RteNewHi = ((uint64_t)( uValue & RT_HI_U32(IOAPIC_RTE_VALID_WRITE_MASK)) << 32) | u32RtePreserveHi;484 uint64_t const u64RteNewHi = ((uint64_t)((uValue & RT_HI_U32(IOAPIC_RTE_VALID_WRITE_MASK)) | u32RtePreserveHi) << 32); 482 485 pThis->au64RedirTable[idxRte] = u64RteNewHi | u32RteLo; 483 486 } … … 569 572 { 570 573 PIOAPIC pThis = PDMINS_2_DATA(pDevIns, PIOAPIC); 571 STAM_COUNTER_INC(&pThis->CTX_SUFF (StatSetEoi));574 STAM_COUNTER_INC(&pThis->CTX_SUFF_Z(StatSetEoi)); 572 575 LogFlow(("IOAPIC: ioapicSetEoi: u8Vector=%#x (%u)\n", u8Vector, u8Vector)); 573 576 … … 581 584 if (IOAPIC_RTE_GET_VECTOR(u64Rte) == u8Vector) 582 585 { 586 Assert(IOAPIC_RTE_GET_REMOTE_IRR(u64Rte)); 583 587 pThis->au64RedirTable[idxRte] &= ~IOAPIC_RTE_REMOTE_IRR; 584 588 fRemoteIrrCleared = true; 589 STAM_COUNTER_INC(&pThis->StatEoiReceived); 585 590 Log2(("IOAPIC: ioapicSetEoi: Cleared remote IRR, idxRte=%u vector=%#x (%u)\n", idxRte, u8Vector, u8Vector)); 586 591 … … 612 617 LogFlow(("IOAPIC: ioapicSetIrq: iIrq=%d iLevel=%d uTagSrc=%#x\n", iIrq, iLevel, uTagSrc)); 613 618 614 STAM_COUNTER_INC(&pThis->CTX_SUFF (StatSetIrq));619 STAM_COUNTER_INC(&pThis->CTX_SUFF_Z(StatSetIrq)); 615 620 616 621 if (RT_LIKELY(iIrq >= 0 && iIrq < (int)RT_ELEMENTS(pThis->au64RedirTable))) … … 738 743 uTagSrc); 739 744 /* Can't reschedule to R3. */ 740 Assert(rc == VINF_SUCCESS );745 Assert(rc == VINF_SUCCESS || rc == VERR_APIC_INTR_DISCARDED); 741 746 } 742 747 … … 748 753 { 749 754 PIOAPIC pThis = PDMINS_2_DATA(pDevIns, PIOAPIC); 750 STAM_COUNTER_INC(&pThis->CTX_SUFF (StatMmioRead));755 STAM_COUNTER_INC(&pThis->CTX_SUFF_Z(StatMmioRead)); 751 756 752 757 int rc = VINF_SUCCESS; … … 781 786 PIOAPIC pThis = PDMINS_2_DATA(pDevIns, PIOAPIC); 782 787 783 STAM_COUNTER_INC(&pThis->CTX_SUFF (StatMmioWrite));788 STAM_COUNTER_INC(&pThis->CTX_SUFF_Z(StatMmioWrite)); 784 789 785 790 Assert(!(GCPhysAddr & 3)); … … 1247 1252 * Statistics. 1248 1253 */ 1249 bool fHasRC = !HMIsEnabledNotMacro(PDMDevHlpGetVM(pDevIns)); 1250 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatMmioReadR0, STAMTYPE_COUNTER, "/Devices/IOAPIC/R0/MmioReadR0", STAMUNIT_OCCURENCES, "Number of IOAPIC MMIO reads in R0."); 1251 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatMmioWriteR0, STAMTYPE_COUNTER, "/Devices/IOAPIC/R0/MmioWriteR0", STAMUNIT_OCCURENCES, "Number of IOAPIC MMIO writes in R0."); 1252 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatSetIrqR0, STAMTYPE_COUNTER, "/Devices/IOAPIC/R0/SetIrqR0", STAMUNIT_OCCURENCES, "Number of IOAPIC SetIrq calls in R0."); 1253 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatSetEoiR0, STAMTYPE_COUNTER, "/Devices/IOAPIC/R0/SetEoiR0", STAMUNIT_OCCURENCES, "Number of IOAPIC SetEoi calls in R0."); 1254 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatMmioReadRZ, STAMTYPE_COUNTER, "/Devices/IOAPIC/RZ/MmioReadRZ", STAMUNIT_OCCURENCES, "Number of IOAPIC MMIO reads in RZ."); 1255 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatMmioWriteRZ, STAMTYPE_COUNTER, "/Devices/IOAPIC/RZ/MmioWriteRZ", STAMUNIT_OCCURENCES, "Number of IOAPIC MMIO writes in RZ."); 1256 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatSetIrqRZ, STAMTYPE_COUNTER, "/Devices/IOAPIC/RZ/SetIrqRZ", STAMUNIT_OCCURENCES, "Number of IOAPIC SetIrq calls in RZ."); 1257 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatSetEoiRZ, STAMTYPE_COUNTER, "/Devices/IOAPIC/RZ/SetEoiRZ", STAMUNIT_OCCURENCES, "Number of IOAPIC SetEoi calls in RZ."); 1254 1258 1255 1259 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatMmioReadR3, STAMTYPE_COUNTER, "/Devices/IOAPIC/R3/MmioReadR3", STAMUNIT_OCCURENCES, "Number of IOAPIC MMIO reads in R3"); … … 1258 1262 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatSetEoiR3, STAMTYPE_COUNTER, "/Devices/IOAPIC/R3/SetEoiR3", STAMUNIT_OCCURENCES, "Number of IOAPIC SetEoi calls in R3."); 1259 1263 1260 if (fHasRC)1261 {1262 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatMmioReadRC, STAMTYPE_COUNTER, "/Devices/IOAPIC/RC/MmioReadRC", STAMUNIT_OCCURENCES, "Number of IOAPIC MMIO reads in RC.");1263 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatMmioWriteRC, STAMTYPE_COUNTER, "/Devices/IOAPIC/RC/MmioWriteRC", STAMUNIT_OCCURENCES, "Number of IOAPIC MMIO writes in RC.");1264 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatSetIrqRC, STAMTYPE_COUNTER, "/Devices/IOAPIC/RC/SetIrqRC", STAMUNIT_OCCURENCES, "Number of IOAPIC SetIrq calls in RC.");1265 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatSetEoiRC, STAMTYPE_COUNTER, "/Devices/IOAPIC/RC/SetEoiRC", STAMUNIT_OCCURENCES, "Number of IOAPIC SetEoi calls in RC.");1266 }1267 1268 1264 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatRedundantEdgeIntr, STAMTYPE_COUNTER, "/Devices/IOAPIC/RedundantEdgeIntr", STAMUNIT_OCCURENCES, "Number of redundant edge-triggered interrupts (no IRR change)."); 1269 1265 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatRedundantLevelIntr, STAMTYPE_COUNTER, "/Devices/IOAPIC/RedundantLevelIntr", STAMUNIT_OCCURENCES, "Number of redundant level-triggered interrupts (no IRR change)."); … … 1272 1268 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatEoiContention, STAMTYPE_COUNTER, "/Devices/IOAPIC/Contention/SetEoi", STAMUNIT_OCCURENCES, "Number of times the critsect is busy during EOI writes causing trips to R3."); 1273 1269 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatSetRteContention, STAMTYPE_COUNTER, "/Devices/IOAPIC/Contention/SetRte", STAMUNIT_OCCURENCES, "Number of times the critsect is busy during RTE writes causing trips to R3."); 1270 1271 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatLevelIrqSent, STAMTYPE_COUNTER, "/Devices/IOAPIC/LevelIntr/Sent", STAMUNIT_OCCURENCES, "Number of level-triggered interrupts sent to the local APIC(s)."); 1272 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatEoiReceived, STAMTYPE_COUNTER, "/Devices/IOAPIC/LevelIntr/Recv", STAMUNIT_OCCURENCES, "Number of EOIs received for level-triggered interrupts from the local APIC(s)."); 1274 1273 #endif 1275 1274 -
trunk/src/VBox/Devices/PC/DevIoApic.cpp
r61841 r61847 180 180 /* We must be sure that attempts to reschedule in R3 181 181 never get here */ 182 Assert(rc == VINF_SUCCESS );182 Assert(rc == VINF_SUCCESS || rc == VERR_APIC_INTR_DISCARDED); 183 183 } 184 184 } … … 524 524 /* We must be sure that attempts to reschedule in R3 525 525 never get here */ 526 Assert(rc == VINF_SUCCESS );526 Assert(rc == VINF_SUCCESS || rc == VERR_APIC_INTR_DISCARDED); 527 527 } 528 528 -
trunk/src/VBox/Devices/testcase/tstDeviceStructSize.cpp
r61339 r61847 339 339 CHECK_MEMBER_ALIGNMENT(IOAPIC, au64RedirTable, 8); 340 340 # ifdef VBOX_WITH_STATISTICS 341 CHECK_MEMBER_ALIGNMENT(IOAPIC, StatMmioReadR 0, 8);341 CHECK_MEMBER_ALIGNMENT(IOAPIC, StatMmioReadRZ, 8); 342 342 # endif 343 343 #else -
trunk/src/VBox/Devices/testcase/tstDeviceStructSizeRC.cpp
r61776 r61847 885 885 GEN_CHECK_OFF(IOAPIC, uIrr); 886 886 # ifdef VBOX_WITH_STATISTICS 887 GEN_CHECK_OFF(IOAPIC, StatMmioReadR 0);887 GEN_CHECK_OFF(IOAPIC, StatMmioReadRZ); 888 888 GEN_CHECK_OFF(IOAPIC, StatMmioReadR3); 889 GEN_CHECK_OFF(IOAPIC, StatMmioReadRC); 890 GEN_CHECK_OFF(IOAPIC, StatMmioWriteR0); 889 GEN_CHECK_OFF(IOAPIC, StatMmioWriteRZ); 891 890 GEN_CHECK_OFF(IOAPIC, StatMmioWriteR3); 892 GEN_CHECK_OFF(IOAPIC, StatMmioWriteRC); 893 GEN_CHECK_OFF(IOAPIC, StatSetIrqR0); 891 GEN_CHECK_OFF(IOAPIC, StatSetIrqRZ); 894 892 GEN_CHECK_OFF(IOAPIC, StatSetIrqR3); 895 GEN_CHECK_OFF(IOAPIC, StatSetIrqRC); 896 GEN_CHECK_OFF(IOAPIC, StatSetEoiR0); 893 GEN_CHECK_OFF(IOAPIC, StatSetEoiRZ); 897 894 GEN_CHECK_OFF(IOAPIC, StatSetEoiR3); 898 GEN_CHECK_OFF(IOAPIC, StatSetEoiRC);899 895 # endif 900 896 #else -
trunk/src/VBox/VMM/VMMAll/APICAll.cpp
r61807 r61847 598 598 * @param enmDeliveryMode The delivery mode. 599 599 * @param pDestCpuSet The destination CPU set. 600 * @param pfIntrAccepted Where to store whether this interrupt was 601 * accepted by the target APIC(s) or not. 602 * Optional, can be NULL. 600 603 * @param rcRZ The return code if the operation cannot be 601 604 * performed in the current context. 602 605 */ 603 606 static VBOXSTRICTRC apicSendIntr(PVM pVM, PVMCPU pVCpu, uint8_t uVector, XAPICTRIGGERMODE enmTriggerMode, 604 XAPICDELIVERYMODE enmDeliveryMode, PCVMCPUSET pDestCpuSet, int rcRZ) 605 { 606 VBOXSTRICTRC rcStrict = VINF_SUCCESS; 607 VMCPUID const cCpus = pVM->cCpus; 607 XAPICDELIVERYMODE enmDeliveryMode, PCVMCPUSET pDestCpuSet, bool *pfIntrAccepted, int rcRZ) 608 { 609 VBOXSTRICTRC rcStrict = VINF_SUCCESS; 610 VMCPUID const cCpus = pVM->cCpus; 611 bool fAccepted = false; 608 612 switch (enmDeliveryMode) 609 613 { … … 614 618 if ( VMCPUSET_IS_PRESENT(pDestCpuSet, idCpu) 615 619 && apicIsEnabled(&pVM->aCpus[idCpu])) 616 apicPostInterrupt(&pVM->aCpus[idCpu], uVector, enmTriggerMode);620 fAccepted = apicPostInterrupt(&pVM->aCpus[idCpu], uVector, enmTriggerMode); 617 621 } 618 622 break; … … 624 628 if ( idCpu < pVM->cCpus 625 629 && apicIsEnabled(&pVM->aCpus[idCpu])) 626 apicPostInterrupt(&pVM->aCpus[idCpu], uVector, enmTriggerMode);630 fAccepted = apicPostInterrupt(&pVM->aCpus[idCpu], uVector, enmTriggerMode); 627 631 else 628 Log2(("APIC: apicSendIntr: No CPU found for lowest-priority delivery mode!\n"));632 AssertMsgFailed(("APIC: apicSendIntr: No CPU found for lowest-priority delivery mode!\n")); 629 633 break; 630 634 } … … 638 642 Log2(("APIC: apicSendIntr: Raising SMI on VCPU%u\n", idCpu)); 639 643 apicSetInterruptFF(&pVM->aCpus[idCpu], PDMAPICIRQ_SMI); 644 fAccepted = true; 640 645 } 641 646 } … … 652 657 Log2(("APIC: apicSendIntr: Raising NMI on VCPU%u\n", idCpu)); 653 658 apicSetInterruptFF(&pVM->aCpus[idCpu], PDMAPICIRQ_NMI); 659 fAccepted = true; 654 660 } 655 661 } … … 665 671 Log2(("APIC: apicSendIntr: Issuing INIT to VCPU%u\n", idCpu)); 666 672 VMMR3SendInitIpi(pVM, idCpu); 673 fAccepted = true; 667 674 } 668 675 #else 669 676 /* We need to return to ring-3 to deliver the INIT. */ 670 677 rcStrict = rcRZ; 678 fAccepted = true; 671 679 #endif 672 680 break; … … 681 689 Log2(("APIC: apicSendIntr: Issuing SIPI to VCPU%u\n", idCpu)); 682 690 VMMR3SendStartupIpi(pVM, idCpu, uVector); 691 fAccepted = true; 683 692 } 684 693 #else 685 694 /* We need to return to ring-3 to deliver the SIPI. */ 686 695 rcStrict = rcRZ; 696 fAccepted = true; 687 697 Log2(("APIC: apicSendIntr: SIPI issued, returning to RZ. rc=%Rrc\n", rcRZ)); 688 698 #endif … … 697 707 Log2(("APIC: apicSendIntr: Raising EXTINT on VCPU%u\n", idCpu)); 698 708 apicSetInterruptFF(&pVM->aCpus[idCpu], PDMAPICIRQ_EXTINT); 709 fAccepted = true; 699 710 } 700 711 break; … … 735 746 } 736 747 } 748 749 if (pfIntrAccepted) 750 *pfIntrAccepted = fAccepted; 751 737 752 return rcStrict; 738 753 } … … 1006 1021 } 1007 1022 1008 return apicSendIntr(pVCpu->CTX_SUFF(pVM), pVCpu, uVector, enmTriggerMode, enmDeliveryMode, &DestCpuSet, rcRZ); 1023 return apicSendIntr(pVCpu->CTX_SUFF(pVM), pVCpu, uVector, enmTriggerMode, enmDeliveryMode, &DestCpuSet, 1024 NULL /* pfIntrAccepted */, rcRZ); 1009 1025 } 1010 1026 … … 1254 1270 apicSignalNextPendingIntr(pVCpu); 1255 1271 } 1272 else 1273 AssertMsgFailed(("APIC%u: apicSetEoi: Failed to find any ISR bit\n", pVCpu->idCpu)); 1256 1274 1257 1275 return VINF_SUCCESS; … … 2275 2293 uVector)); 2276 2294 2295 bool fIntrAccepted; 2277 2296 VMCPUSET DestCpuSet; 2278 2297 apicGetDestCpuSet(pVM, fDestMask, fBroadcastMask, enmDestMode, enmDeliveryMode, &DestCpuSet); 2279 2298 VBOXSTRICTRC rcStrict = apicSendIntr(pVM, NULL /* pVCpu */, uVector, enmTriggerMode, enmDeliveryMode, &DestCpuSet, 2280 VINF_SUCCESS /* rcRZ */); 2281 return VBOXSTRICTRC_VAL(rcStrict); 2299 &fIntrAccepted, VINF_SUCCESS /* rcRZ */); 2300 if (fIntrAccepted) 2301 return VBOXSTRICTRC_VAL(rcStrict); 2302 return VERR_APIC_INTR_DISCARDED; 2282 2303 } 2283 2304 … … 2379 2400 VMCPUSET_ADD(&DestCpuSet, pVCpu->idCpu); 2380 2401 rcStrict = apicSendIntr(pVCpu->CTX_SUFF(pVM), pVCpu, uVector, enmTriggerMode, enmDeliveryMode, 2381 &DestCpuSet, rcRZ);2402 &DestCpuSet, NULL /* pfIntrAccepted */, rcRZ); 2382 2403 } 2383 2404 break; … … 2392 2413 uint8_t const uVector = XAPIC_LVT_GET_VECTOR(uLvt); 2393 2414 rcStrict = apicSendIntr(pVCpu->CTX_SUFF(pVM), pVCpu, uVector, enmTriggerMode, enmDeliveryMode, &DestCpuSet, 2394 rcRZ);2415 NULL /* pfIntrAccepted */, rcRZ); 2395 2416 break; 2396 2417 } … … 2600 2621 * Don't use this function to try and deliver ExtINT style interrupts. 2601 2622 * 2623 * @returns true if the interrupt was accepted, false otherwise. 2602 2624 * @param pVCpu The cross context virtual CPU structure. 2603 2625 * @param uVector The vector of the interrupt to be posted. … … 2606 2628 * @thread Any. 2607 2629 */ 2608 VMM_INT_DECL( void) apicPostInterrupt(PVMCPU pVCpu, uint8_t uVector, XAPICTRIGGERMODE enmTriggerMode)2630 VMM_INT_DECL(bool) apicPostInterrupt(PVMCPU pVCpu, uint8_t uVector, XAPICTRIGGERMODE enmTriggerMode) 2609 2631 { 2610 2632 Assert(pVCpu); 2611 2633 Assert(uVector > XAPIC_ILLEGAL_VECTOR_END); 2612 2634 2613 PVM pVM = pVCpu->CTX_SUFF(pVM); 2614 PCAPIC pApic = VM_TO_APIC(pVM); 2615 PAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpu); 2635 PVM pVM = pVCpu->CTX_SUFF(pVM); 2636 PCAPIC pApic = VM_TO_APIC(pVM); 2637 PAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpu); 2638 bool fAccepted = true; 2616 2639 2617 2640 STAM_PROFILE_START(&pApicCpu->StatPostIntr, a); … … 2630 2653 if (!apicTestVectorInReg(&pXApicPage->irr, uVector)) /* PAV */ 2631 2654 { 2632 Log2(("APIC: APICPostInterrupt: SrcCpu=%u TargetCpu=%u uVector=%#x\n", VMMGetCpuId(pVM), pVCpu->idCpu, uVector));2655 Log2(("APIC: apicPostInterrupt: SrcCpu=%u TargetCpu=%u uVector=%#x\n", VMMGetCpuId(pVM), pVCpu->idCpu, uVector)); 2633 2656 if (enmTriggerMode == XAPICTRIGGERMODE_EDGE) 2634 2657 { … … 2641 2664 if (!fAlreadySet) 2642 2665 { 2643 Log2(("APIC: APICPostInterrupt: Setting UPDATE_APIC FF for edge-triggered intr. uVector=%#x\n", uVector));2666 Log2(("APIC: apicPostInterrupt: Setting UPDATE_APIC FF for edge-triggered intr. uVector=%#x\n", uVector)); 2644 2667 apicSetInterruptFF(pVCpu, PDMAPICIRQ_UPDATE_PENDING); 2645 2668 } … … 2656 2679 if (!fAlreadySet) 2657 2680 { 2658 Log2(("APIC: APICPostInterrupt: Setting UPDATE_APIC FF for level-triggered intr. uVector=%#x\n", uVector));2681 Log2(("APIC: apicPostInterrupt: Setting UPDATE_APIC FF for level-triggered intr. uVector=%#x\n", uVector)); 2659 2682 apicSetInterruptFF(pVCpu, PDMAPICIRQ_UPDATE_PENDING); 2660 2683 } … … 2663 2686 else 2664 2687 { 2665 Log2(("APIC: APICPostInterrupt: SrcCpu=%u TargetCpu=%u. Vector %#x Already in IRR, skipping\n", VMMGetCpuId(pVM),2688 Log2(("APIC: apicPostInterrupt: SrcCpu=%u TargetCpu=%u. Vector %#x Already in IRR, skipping\n", VMMGetCpuId(pVM), 2666 2689 pVCpu->idCpu, uVector)); 2667 2690 STAM_COUNTER_INC(&pApicCpu->StatPostIntrAlreadyPending); … … 2669 2692 } 2670 2693 else 2694 { 2695 fAccepted = false; 2671 2696 apicSetError(pVCpu, XAPIC_ESR_RECV_ILLEGAL_VECTOR); 2697 } 2672 2698 2673 2699 STAM_PROFILE_STOP(&pApicCpu->StatPostIntr, a); 2700 return fAccepted; 2674 2701 } 2675 2702 … … 2817 2844 2818 2845 /* Update edge-triggered pending interrupts. */ 2846 PAPICPIB pPib = (PAPICPIB)pApicCpu->CTX_SUFF(pvApicPib); 2819 2847 for (;;) 2820 2848 { … … 2823 2851 break; 2824 2852 2825 PAPICPIB pPib = (PAPICPIB)pApicCpu->CTX_SUFF(pvApicPib);2826 2853 AssertCompile(RT_ELEMENTS(pXApicPage->irr.u) == 2 * RT_ELEMENTS(pPib->aVectorBitmap)); 2827 2828 2854 for (size_t idxPib = 0, idxReg = 0; idxPib < RT_ELEMENTS(pPib->aVectorBitmap); idxPib++, idxReg += 2) 2829 2855 { … … 2845 2871 2846 2872 /* Update level-triggered pending interrupts. */ 2873 pPib = (PAPICPIB)&pApicCpu->ApicPibLevel; 2847 2874 for (;;) 2848 2875 { … … 2851 2878 break; 2852 2879 2853 PAPICPIB pPib = (PAPICPIB)&pApicCpu->ApicPibLevel;2854 2880 AssertCompile(RT_ELEMENTS(pXApicPage->irr.u) == 2 * RT_ELEMENTS(pPib->aVectorBitmap)); 2855 2856 2881 for (size_t idxPib = 0, idxReg = 0; idxPib < RT_ELEMENTS(pPib->aVectorBitmap); idxPib++, idxReg += 2) 2857 2882 { -
trunk/src/VBox/VMM/VMMAll/PDMAll.cpp
r61685 r61847 64 64 * The local APIC has a higher priority than the PIC. 65 65 */ 66 int rc = VERR_NO_DATA; 66 67 if (VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INTERRUPT_APIC)) 67 68 { … … 71 72 uint32_t uTagSrc; 72 73 uint8_t uVector; 73 intrc = pVM->pdm.s.Apic.CTX_SUFF(pfnGetInterrupt)(pVM->pdm.s.Apic.CTX_SUFF(pDevIns), pVCpu, &uVector, &uTagSrc);74 rc = pVM->pdm.s.Apic.CTX_SUFF(pfnGetInterrupt)(pVM->pdm.s.Apic.CTX_SUFF(pDevIns), pVCpu, &uVector, &uTagSrc); 74 75 if (RT_SUCCESS(rc)) 75 76 { … … 119 120 120 121 pdmUnlock(pVM); 121 return VERR_NO_DATA;122 return rc; 122 123 } 123 124 -
trunk/src/VBox/VMM/VMMR3/APIC.cpp
r61812 r61847 1797 1797 } while(0) 1798 1798 1799 bool const fHasRC = !HMIsEnabled (pVM);1799 bool const fHasRC = !HMIsEnabledNotMacro(pVM); 1800 1800 for (VMCPUID idCpu = 0; idCpu < pVM->cCpus; idCpu++) 1801 1801 { -
trunk/src/VBox/VMM/include/APICInternal.h
r61809 r61847 1442 1442 uint8_t uVector, uint8_t uPolarity, uint8_t uTriggerMode, uint32_t uTagSrc); 1443 1443 1444 VMM_INT_DECL( void) apicPostInterrupt(PVMCPU pVCpu, uint8_t uVector, XAPICTRIGGERMODE enmTriggerMode);1444 VMM_INT_DECL(bool) apicPostInterrupt(PVMCPU pVCpu, uint8_t uVector, XAPICTRIGGERMODE enmTriggerMode); 1445 1445 VMM_INT_DECL(void) apicStartTimer(PVMCPU pVCpu, uint32_t uInitialCount); 1446 1446 VMM_INT_DECL(void) apicStopTimer(PVMCPU pVCpu);
Note:
See TracChangeset
for help on using the changeset viewer.

