Changeset 61339 in vbox
- Timestamp:
- May 31, 2016 2:23:24 PM (9 years ago)
- svn:sync-xref-src-repo-rev:
- 107634
- Location:
- trunk
- Files:
-
- 1 added
- 18 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Config.kmk
r61332 r61339 401 401 # Enables the new APIC code. 402 402 VBOX_WITH_NEW_APIC = 1 403 # Enables the new I/O APIC code. 404 #VBOX_WITH_NEW_IOAPIC = 1 403 405 ## @} 404 406 -
trunk/include/VBox/vmm/pdmdev.h
r60804 r61339 1403 1403 1404 1404 /** 1405 * Broadcasts an EOI for an interrupt vector to the I/O APICs. 1406 * 1407 * @returns Ring-0 pointer to the critical section. 1408 * @param pDevIns The APIC device instance. 1409 * @param u8Vector The interrupt vector. 1410 */ 1411 DECLRCCALLBACKMEMBER(void, pfnBusBroadcastEoi,(PPDMDEVINS pDevIns, uint8_t u8Vector)); 1412 1413 /** 1405 1414 * Calculates an IRQ tag for a timer, IPI or similar event. 1406 1415 * … … 1452 1461 1453 1462 /** Current PDMAPICHLPRC version number. */ 1454 #define PDM_APICHLPRC_VERSION PDM_VERSION_MAKE(0xfff5, 2, 0)1463 #define PDM_APICHLPRC_VERSION PDM_VERSION_MAKE(0xfff5, 3, 0) 1455 1464 1456 1465 … … 1480 1489 */ 1481 1490 DECLR0CALLBACKMEMBER(void, pfnClearInterruptFF,(PPDMDEVINS pDevIns, PDMAPICIRQ enmType, VMCPUID idCpu)); 1491 1492 /** 1493 * Broadcasts an EOI for an interrupt vector to the I/O APICs. 1494 * 1495 * @returns Ring-0 pointer to the critical section. 1496 * @param pDevIns The APIC device instance. 1497 * @param u8Vector The interrupt vector. 1498 */ 1499 DECLR0CALLBACKMEMBER(void, pfnBusBroadcastEoi,(PPDMDEVINS pDevIns, uint8_t u8Vector)); 1482 1500 1483 1501 /** … … 1531 1549 1532 1550 /** Current PDMAPICHLPR0 version number. */ 1533 #define PDM_APICHLPR0_VERSION PDM_VERSION_MAKE(0xfff4, 2, 0)1551 #define PDM_APICHLPR0_VERSION PDM_VERSION_MAKE(0xfff4, 3, 0) 1534 1552 1535 1553 /** … … 1558 1576 */ 1559 1577 DECLR3CALLBACKMEMBER(void, pfnClearInterruptFF,(PPDMDEVINS pDevIns, PDMAPICIRQ enmType, VMCPUID idCpu)); 1578 1579 /** 1580 * Broadcasts an EOI for an interrupt vector to the I/O APICs. 1581 * 1582 * @returns Ring-0 pointer to the critical section. 1583 * @param pDevIns The APIC device instance. 1584 * @param u8Vector The interrupt vector. 1585 */ 1586 DECLR3CALLBACKMEMBER(void, pfnBusBroadcastEoi,(PPDMDEVINS pDevIns, uint8_t u8Vector)); 1560 1587 1561 1588 /** … … 1656 1683 1657 1684 /** Current PDMAPICHLP version number. */ 1658 #define PDM_APICHLPR3_VERSION PDM_VERSION_MAKE(0xfff3, 2, 0)1685 #define PDM_APICHLPR3_VERSION PDM_VERSION_MAKE(0xfff3, 3, 0) 1659 1686 1660 1687 … … 1668 1695 1669 1696 /** 1670 * Set thean IRQ.1697 * Set an IRQ. 1671 1698 * 1672 1699 * @param pDevIns Device instance of the I/O APIC. … … 1700 1727 /** The name of the R0 SendMsi entry point. */ 1701 1728 const char *pszSendMsiR0; 1729 1730 /** 1731 * Set the EOI for an interrupt vector. 1732 * 1733 * @param pDevIns Device instance of the I/O APIC. 1734 * @param u8Vector The vector. 1735 * @remarks Caller enters the PDM critical section 1736 */ 1737 DECLR3CALLBACKMEMBER(void, pfnSetEoiR3,(PPDMDEVINS pDevIns, uint8_t u8Vector)); 1738 1739 /** The name of the RC SetEoi entry point. */ 1740 const char *pszSetEoiRC; 1741 1742 /** The name of the R0 SetEoi entry point. */ 1743 const char *pszSetEoiR0; 1702 1744 } PDMIOAPICREG; 1703 1745 /** Pointer to an APIC registration structure. */ … … 1705 1747 1706 1748 /** Current PDMAPICREG version number. */ 1707 #define PDM_IOAPICREG_VERSION PDM_VERSION_MAKE(0xfff2, 3, 0)1749 #define PDM_IOAPICREG_VERSION PDM_VERSION_MAKE(0xfff2, 4, 0) 1708 1750 1709 1751 -
trunk/src/VBox/Devices/Makefile.kmk
r61332 r61339 117 117 VBOX_HGCM_HOST_CODE \ 118 118 $(if $(VBOX_WITH_HGCM),VBOX_WITH_HGCM,) \ 119 $(if $(VBOX_WITH_NEW_IOAPIC),VBOX_WITH_NEW_IOAPIC,) \ 119 120 $(if $(VBOX_BIOS_DMI_FALLBACK),VBOX_BIOS_DMI_FALLBACK,) \ 120 121 VBOX_WITH_DMI_CHASSIS \ … … 159 160 PC/DevDMA.cpp \ 160 161 PC/DevHPET.cpp \ 162 $(if $(VBOX_WITH_NEW_IOAPIC),PC/DevIOAPIC_New.cpp,) \ 161 163 Storage/DevFdc.cpp \ 162 164 Serial/DevSerial.cpp \ … … 880 882 VBoxDDRC_INCS = build 881 883 VBoxDDRC_SOURCES = \ 882 Audio/DevIchHda.cpp \884 Audio/DevIchHda.cpp \ 883 885 Bus/DevPCI.cpp \ 884 Bus/DevPciIch9.cpp \885 Bus/MsiCommon.cpp \886 Bus/MsixCommon.cpp \887 EFI/DevSmc.cpp \886 Bus/DevPciIch9.cpp \ 887 Bus/MsiCommon.cpp \ 888 Bus/MsixCommon.cpp \ 889 EFI/DevSmc.cpp \ 888 890 Graphics/DevVGA.cpp \ 889 891 Input/DevPS2.cpp \ 890 Input/PS2K.cpp \891 Input/PS2M.cpp \892 Input/PS2K.cpp \ 893 Input/PS2M.cpp \ 892 894 PC/DevACPI.cpp \ 895 $(if $(VBOX_WITH_NEW_IOAPIC),PC/DevIOAPIC_New.cpp,) \ 893 896 PC/DevPit-i8254.cpp \ 894 897 PC/DevPIC.cpp \ 895 898 PC/DevRTC.cpp \ 896 PC/DevHPET.cpp \899 PC/DevHPET.cpp \ 897 900 Storage/DevATA.cpp \ 898 901 Network/DevPCNet.cpp \ 899 902 Serial/DevSerial.cpp \ 900 903 Parallel/DevParallel.cpp \ 901 VMMDev/VMMDevTesting.cpp904 VMMDev/VMMDevTesting.cpp 902 905 903 906 ifdef VBOX_WITH_E1000 … … 1014 1017 VBoxDD2_SOURCES = \ 1015 1018 build/VBoxDD2.cpp \ 1016 PC/DevIoApic.cpp \1017 1019 PC/DevLPC.cpp 1018 1020 ifndef VBOX_WITH_NEW_APIC 1019 1021 VBoxDD2_SOURCES += PC/DevAPIC.cpp 1022 endif 1023 ifndef VBOX_WITH_NEW_IOAPIC 1024 VBoxDD2_SOURCES += PC/DevIoApic.cpp 1020 1025 endif 1021 1026 VBoxDD2_LIBS = \ … … 1038 1043 VBoxDD2_DEFS += VBOX_WITH_NEW_APIC 1039 1044 endif 1045 ifdef VBOX_WITH_NEW_IOAPIC 1046 VBoxDD2_DEFS += VBOX_WITH_NEW_IOAPIC 1047 endif 1040 1048 1041 1049 $(call VBOX_SET_VER_INFO_DLL,VBoxDD2,VirtualBox VMM Devices and Drivers 2) # (last!) … … 1056 1064 Bus/MsiCommon.cpp \ 1057 1065 Bus/MsixCommon.cpp \ 1058 EFI/DevSmc.cpp \1066 EFI/DevSmc.cpp \ 1059 1067 Graphics/DevVGA.cpp \ 1060 1068 Input/DevPS2.cpp \ … … 1062 1070 Input/PS2M.cpp \ 1063 1071 PC/DevACPI.cpp \ 1072 $(if $(VBOX_WITH_NEW_IOAPIC),PC/DevIOAPIC_New.cpp,) \ 1064 1073 PC/DevPit-i8254.cpp \ 1065 1074 PC/DevPIC.cpp \ -
trunk/src/VBox/Devices/PC/DevIoApic.cpp
r60635 r61339 797 797 IoApicReg.pszSendMsiRC = fRZEnabled ? "ioapicSendMsi" : NULL; 798 798 IoApicReg.pszSendMsiR0 = fRZEnabled ? "ioapicSendMsi" : NULL; 799 IoApicReg.pfnSetEoiR3 = NULL; 800 IoApicReg.pszSetEoiR0 = NULL; 801 IoApicReg.pszSetEoiRC = NULL; 799 802 800 803 rc = PDMDevHlpIOAPICRegister(pDevIns, &IoApicReg, &pThis->pIoApicHlpR3); -
trunk/src/VBox/Devices/build/VBoxDD.cpp
r61320 r61339 66 66 if (RT_FAILURE(rc)) 67 67 return rc; 68 #ifdef VBOX_WITH_NEW_IOAPIC 69 rc = pCallbacks->pfnRegister(pCallbacks, &g_DeviceIOAPIC); 70 if (RT_FAILURE(rc)) 71 return rc; 72 #endif 68 73 rc = pCallbacks->pfnRegister(pCallbacks, &g_DevicePS2KeyboardMouse); 69 74 if (RT_FAILURE(rc)) -
trunk/src/VBox/Devices/build/VBoxDD.h
r59248 r61339 33 33 extern const PDMDEVREG g_DevicePcArch; 34 34 extern const PDMDEVREG g_DevicePcBios; 35 #ifdef VBOX_WITH_NEW_IOAPIC 36 extern const PDMDEVREG g_DeviceIOAPIC; 37 #endif 35 38 extern const PDMDEVREG g_DevicePS2KeyboardMouse; 36 39 extern const PDMDEVREG g_DeviceI8254; -
trunk/src/VBox/Devices/build/VBoxDD2.cpp
r60422 r61339 68 68 return rc; 69 69 #endif 70 #ifndef VBOX_WITH_NEW_IOAPIC 70 71 rc = pCallbacks->pfnRegister(pCallbacks, &g_DeviceIOAPIC); 71 72 if (RT_FAILURE(rc)) 72 73 return rc; 74 #endif 73 75 rc = pCallbacks->pfnRegister(pCallbacks, &g_DeviceLPC); 74 76 if (RT_FAILURE(rc)) -
trunk/src/VBox/Devices/build/VBoxDD2.h
r60422 r61339 64 64 extern const PDMDEVREG g_DeviceAPIC; 65 65 #endif 66 #ifndef VBOX_WITH_NEW_IOAPIC 66 67 extern const PDMDEVREG g_DeviceIOAPIC; 68 #endif 67 69 extern const PDMDEVREG g_DeviceLPC; 68 70 -
trunk/src/VBox/Devices/testcase/Makefile.kmk
r60307 r61339 36 36 $(if $(VBOX_WITH_LSILOGIC),VBOX_WITH_LSILOGIC,) \ 37 37 $(if $(VBOX_WITH_NEW_APIC),VBOX_WITH_NEW_APIC,) \ 38 $(if $(VBOX_WITH_NEW_IOAPIC),VBOX_WITH_NEW_IOAPIC,) \ 38 39 $(if $(VBOX_WITH_NEW_PS2M),VBOX_WITH_NEW_PS2M,) \ 39 40 $(if $(VBOX_WITH_NVME_IMPL),VBOX_WITH_NVME_IMPL,) \ -
trunk/src/VBox/Devices/testcase/tstDeviceStructSize.cpp
r60855 r61339 65 65 #endif 66 66 #undef LOG_GROUP 67 #include "../PC/DevIoApic.cpp" 67 #ifdef VBOX_WITH_NEW_IOAPIC 68 # include "../PC/DevIOAPIC_New.cpp" 69 #else 70 # include "../PC/DevIoApic.cpp" 71 #endif 68 72 #undef LOG_GROUP 69 73 #include "../PC/DevHPET.cpp" … … 332 336 #endif 333 337 CHECK_MEMBER_ALIGNMENT(E1KSTATE, StatReceiveBytes, 8); 334 #ifdef VBOX_WITH_STATISTICS 338 #ifdef VBOX_WITH_NEW_IOAPIC 339 CHECK_MEMBER_ALIGNMENT(IOAPIC, au64RedirTable, 8); 340 # ifdef VBOX_WITH_STATISTICS 341 CHECK_MEMBER_ALIGNMENT(IOAPIC, StatMmioReadR0, 8); 342 # endif 343 #else 344 # ifdef VBOX_WITH_STATISTICS 335 345 CHECK_MEMBER_ALIGNMENT(IOAPIC, StatMMIOReadGC, 8); 336 346 CHECK_MEMBER_ALIGNMENT(IOAPIC, StatMMIOReadGC, 8); 347 # endif 337 348 #endif 338 349 CHECK_MEMBER_ALIGNMENT(LSILOGISCSI, GCPhysMMIOBase, 8); -
trunk/src/VBox/Devices/testcase/tstDeviceStructSizeRC.cpp
r61150 r61339 67 67 #endif 68 68 #undef LOG_GROUP 69 #include "../PC/DevIoApic.cpp" 69 #ifdef VBOX_WITH_NEW_IOAPIC 70 # include "../PC/DevIOAPIC_New.cpp" 71 #else 72 # include "../PC/DevIoApic.cpp" 73 #endif 70 74 #undef LOG_GROUP 71 75 #include "../Storage/DevATA.cpp" … … 866 870 #endif /* VBOX_WITH_NEW_APIC */ 867 871 872 #ifdef VBOX_WITH_NEW_IOAPIC 873 /* PC/DevIOAPIC_New.cpp */ 874 GEN_CHECK_SIZE(IOAPIC); 875 GEN_CHECK_OFF(IOAPIC, pDevInsR3); 876 GEN_CHECK_OFF(IOAPIC, pIoApicHlpR3); 877 GEN_CHECK_OFF(IOAPIC, pDevInsR0); 878 GEN_CHECK_OFF(IOAPIC, pIoApicHlpR0); 879 GEN_CHECK_OFF(IOAPIC, pDevInsRC); 880 GEN_CHECK_OFF(IOAPIC, pIoApicHlpRC); 881 GEN_CHECK_OFF(IOAPIC, u8Id); 882 GEN_CHECK_OFF(IOAPIC, u8Index); 883 GEN_CHECK_OFF(IOAPIC, cCpus); 884 GEN_CHECK_OFF(IOAPIC, au64RedirTable); 885 GEN_CHECK_OFF(IOAPIC, uIrr); 886 # ifdef VBOX_WITH_STATISTICS 887 GEN_CHECK_OFF(IOAPIC, StatMmioReadR0); 888 GEN_CHECK_OFF(IOAPIC, StatMmioReadR3); 889 GEN_CHECK_OFF(IOAPIC, StatMmioReadRC); 890 GEN_CHECK_OFF(IOAPIC, StatMmioWriteR0); 891 GEN_CHECK_OFF(IOAPIC, StatMmioWriteR3); 892 GEN_CHECK_OFF(IOAPIC, StatMmioWriteRC); 893 GEN_CHECK_OFF(IOAPIC, StatSetIrqR0); 894 GEN_CHECK_OFF(IOAPIC, StatSetIrqR3); 895 GEN_CHECK_OFF(IOAPIC, StatSetIrqRC); 896 GEN_CHECK_OFF(IOAPIC, StatSetEoiR0); 897 GEN_CHECK_OFF(IOAPIC, StatSetEoiR3); 898 GEN_CHECK_OFF(IOAPIC, StatSetEoiRC); 899 # endif 900 #else 868 901 /* PC/DevIoApic.cpp */ 869 902 GEN_CHECK_SIZE(IOAPIC); … … 880 913 GEN_CHECK_OFF(IOAPIC, pDevInsRC); 881 914 GEN_CHECK_OFF(IOAPIC, pIoApicHlpRC); 882 # ifdef VBOX_WITH_STATISTICS915 # ifdef VBOX_WITH_STATISTICS 883 916 GEN_CHECK_OFF(IOAPIC, StatMMIOReadGC); 884 917 GEN_CHECK_OFF(IOAPIC, StatSetIrqHC); 885 #endif 918 # endif 919 #endif /* VBOX_WITH_NEW_IOAPIC */ 886 920 887 921 /* Storage/DevATA.cpp */ -
trunk/src/VBox/VMM/Makefile.kmk
r61068 r61339 90 90 ifdef VBOX_WITH_NEW_APIC 91 91 VMM_COMMON_DEFS += VBOX_WITH_NEW_APIC 92 endif 93 ifdef VBOX_WITH_NEW_IOAPIC 94 VMM_COMMON_DEFS += VBOX_WITH_NEW_IOAPIC 92 95 endif 93 96 -
trunk/src/VBox/VMM/VMMAll/APICAll.cpp
r61324 r61339 462 462 uint8_t *pbXApic = (uint8_t *)pXApicPage; 463 463 *(uint32_t *)(pbXApic + offReg) = uReg; 464 } 465 466 467 /** 468 * Broadcasts the EOI to the I/O APICs. 469 * 470 * @param pVCpu The cross context virtual CPU structure. 471 * @param uVector The interrupt vector corresponding to the EOI. 472 */ 473 DECLINLINE(void) apicBusBroadcastEoi(PVMCPU pVCpu, uint8_t uVector) 474 { 475 PVM pVM = pVCpu->CTX_SUFF(pVM); 476 PAPICDEV pApicDev = VM_TO_APICDEV(pVM); 477 pApicDev->CTX_SUFF(pApicHlp)->pfnBusBroadcastEoi(pApicDev->CTX_SUFF(pDevIns), uVector); 464 478 } 465 479 … … 1194 1208 if (fLevelTriggered) 1195 1209 { 1196 /** @todo We need to broadcast EOI to IO APICs here. */1197 1210 apicClearVectorInReg(&pXApicPage->tmr, uVector); 1211 apicBusBroadcastEoi(pVCpu, uVector); 1198 1212 Log2(("APIC%u: apicSetEoi: Cleared level triggered interrupt from TMR. uVector=%#x\n", pVCpu->idCpu, uVector)); 1199 1213 } -
trunk/src/VBox/VMM/VMMR0/PDMR0Device.cpp
r60804 r61339 605 605 606 606 607 /** @interface_method_impl{PDMAPICHLPR0,pfnBusBroadcastEoi} */ 608 static DECLCALLBACK(void) pdmR0ApicHlp_BusBroadcastEoi(PPDMDEVINS pDevIns, uint8_t u8Vector) 609 { 610 /* pfnSetEoi will be NULL in the old IOAPIC code as it's not implemented. */ 611 #ifdef VBOX_WITH_NEW_IOAPIC 612 PDMDEV_ASSERT_DEVINS(pDevIns); 613 PVM pVM = pDevIns->Internal.s.CTX_SUFF(pVM); 614 615 /* At present, we support only a maximum of one I/O APIC for a VM. If we ever implement having 616 multiple I/O APICs per-VM, we'll have to broadcast this EOI to all of the I/O APICs. */ 617 if (pVM->pdm.s.IoApic.CTX_SUFF(pDevIns)) 618 { 619 Assert(pVM->pdm.s.IoApic.CTX_SUFF(pfnSetEoi)); 620 pdmLock(pVM); 621 pVM->pdm.s.IoApic.CTX_SUFF(pfnSetEoi)(pVM->pdm.s.IoApic.CTX_SUFF(pDevIns), u8Vector); 622 pdmUnlock(pVM); 623 } 624 #endif 625 } 626 627 607 628 /** @interface_method_impl{PDMAPICHLPR0,pfnCalcIrqTag} */ 608 629 static DECLCALLBACK(uint32_t) pdmR0ApicHlp_CalcIrqTag(PPDMDEVINS pDevIns, uint8_t u8Level) … … 684 705 pdmR0ApicHlp_SetInterruptFF, 685 706 pdmR0ApicHlp_ClearInterruptFF, 707 pdmR0ApicHlp_BusBroadcastEoi, 686 708 pdmR0ApicHlp_CalcIrqTag, 687 709 pdmR0ApicHlp_ChangeFeature, -
trunk/src/VBox/VMM/VMMR3/PDMDevHlp.cpp
r60716 r61339 2613 2613 static DECLCALLBACK(int) pdmR3DevHlp_APICRegister(PPDMDEVINS pDevIns, PPDMAPICREG pApicReg, PCPDMAPICHLPR3 *ppApicHlpR3) 2614 2614 { 2615 #if 02616 #ifdef VBOX_WITH_NEW_APIC2617 PDMDEV_ASSERT_DEVINS(pDevIns);2618 VM_ASSERT_EMT(pDevIns->Internal.s.pVMR3);2619 NOREF(pApicReg);2620 *ppApicHlpR3 = &g_pdmR3DevApicHlp;2621 return VINF_SUCCESS;2622 #endif2623 #endif2624 2625 2615 PDMDEV_ASSERT_DEVINS(pDevIns); 2626 2616 VM_ASSERT_EMT(pDevIns->Internal.s.pVMR3); … … 2946 2936 return VERR_INVALID_PARAMETER; 2947 2937 } 2948 if (!pIoApicReg->pfnSetIrqR3 || !pIoApicReg->pfnSendMsiR3) 2938 if (!pIoApicReg->pfnSetIrqR3 || !pIoApicReg->pfnSendMsiR3 2939 #ifdef VBOX_WITH_NEW_IOAPIC 2940 || !pIoApicReg->pfnSetEoiR3 2941 #endif 2942 ) 2949 2943 { 2950 2944 Assert(pIoApicReg->pfnSetIrqR3); … … 2966 2960 return VERR_INVALID_PARAMETER; 2967 2961 } 2962 if ( pIoApicReg->pszSetEoiRC 2963 && !VALID_PTR(pIoApicReg->pszSetEoiRC)) 2964 { 2965 Assert(VALID_PTR(pIoApicReg->pszSetEoiRC)); 2966 LogFlow(("pdmR3DevHlp_IOAPICRegister: caller='%s'/%d: returns %Rrc (GC callbacks)\n", pDevIns->pReg->szName, pDevIns->iInstance, VERR_INVALID_PARAMETER)); 2967 return VERR_INVALID_PARAMETER; 2968 } 2968 2969 if ( pIoApicReg->pszSetIrqR0 2969 2970 && !VALID_PTR(pIoApicReg->pszSetIrqR0)) … … 2977 2978 { 2978 2979 Assert(VALID_PTR(pIoApicReg->pszSendMsiR0)); 2980 LogFlow(("pdmR3DevHlp_IOAPICRegister: caller='%s'/%d: returns %Rrc (GC callbacks)\n", pDevIns->pReg->szName, pDevIns->iInstance, VERR_INVALID_PARAMETER)); 2981 return VERR_INVALID_PARAMETER; 2982 } 2983 if ( pIoApicReg->pszSetEoiR0 2984 && !VALID_PTR(pIoApicReg->pszSetEoiR0)) 2985 { 2986 Assert(VALID_PTR(pIoApicReg->pszSetEoiR0)); 2979 2987 LogFlow(("pdmR3DevHlp_IOAPICRegister: caller='%s'/%d: returns %Rrc (GC callbacks)\n", pDevIns->pReg->szName, pDevIns->iInstance, VERR_INVALID_PARAMETER)); 2980 2988 return VERR_INVALID_PARAMETER; … … 3038 3046 if (pIoApicReg->pszSendMsiRC) 3039 3047 { 3040 int rc = pdmR3DevGetSymbolRCLazy(pDevIns, pIoApicReg->pszSe tIrqRC, &pVM->pdm.s.IoApic.pfnSendMsiRC);3048 int rc = pdmR3DevGetSymbolRCLazy(pDevIns, pIoApicReg->pszSendMsiRC, &pVM->pdm.s.IoApic.pfnSendMsiRC); 3041 3049 AssertMsgRC(rc, ("%s::%s rc=%Rrc\n", pDevIns->pReg->szRCMod, pIoApicReg->pszSendMsiRC, rc)); 3042 3050 if (RT_FAILURE(rc)) … … 3049 3057 { 3050 3058 pVM->pdm.s.IoApic.pfnSendMsiRC = 0; 3059 } 3060 3061 if (pIoApicReg->pszSetEoiRC) 3062 { 3063 int rc = pdmR3DevGetSymbolRCLazy(pDevIns, pIoApicReg->pszSetEoiRC, &pVM->pdm.s.IoApic.pfnSetEoiRC); 3064 AssertMsgRC(rc, ("%s::%s rc=%Rrc\n", pDevIns->pReg->szRCMod, pIoApicReg->pszSetEoiRC, rc)); 3065 if (RT_FAILURE(rc)) 3066 { 3067 LogFlow(("pdmR3DevHlp_IOAPICRegister: caller='%s'/%d: returns %Rrc\n", pDevIns->pReg->szName, pDevIns->iInstance, rc)); 3068 return rc; 3069 } 3070 } 3071 else 3072 { 3073 pVM->pdm.s.IoApic.pfnSetEoiRC = 0; 3051 3074 } 3052 3075 … … 3087 3110 } 3088 3111 3112 if (pIoApicReg->pszSetEoiR0) 3113 { 3114 int rc = pdmR3DevGetSymbolR0Lazy(pDevIns, pIoApicReg->pszSetEoiR0, &pVM->pdm.s.IoApic.pfnSetEoiR0); 3115 AssertMsgRC(rc, ("%s::%s rc=%Rrc\n", pDevIns->pReg->szR0Mod, pIoApicReg->pszSetEoiR0, rc)); 3116 if (RT_FAILURE(rc)) 3117 { 3118 LogFlow(("pdmR3DevHlp_IOAPICRegister: caller='%s'/%d: returns %Rrc\n", pDevIns->pReg->szName, pDevIns->iInstance, rc)); 3119 return rc; 3120 } 3121 } 3122 else 3123 { 3124 pVM->pdm.s.IoApic.pfnSetEoiR0 = 0; 3125 } 3126 3089 3127 3090 3128 /* … … 3092 3130 */ 3093 3131 pVM->pdm.s.IoApic.pDevInsR3 = pDevIns; 3094 pVM->pdm.s.IoApic.pfnSetIrqR3 = pIoApicReg->pfnSetIrqR3;3132 pVM->pdm.s.IoApic.pfnSetIrqR3 = pIoApicReg->pfnSetIrqR3; 3095 3133 pVM->pdm.s.IoApic.pfnSendMsiR3 = pIoApicReg->pfnSendMsiR3; 3134 pVM->pdm.s.IoApic.pfnSetEoiR3 = pIoApicReg->pfnSetEoiR3; 3096 3135 Log(("PDM: Registered I/O APIC device '%s'/%d pDevIns=%p\n", pDevIns->pReg->szName, pDevIns->iInstance, pDevIns)); 3097 3136 -
trunk/src/VBox/VMM/VMMR3/PDMDevMiscHlp.cpp
r60804 r61339 268 268 269 269 270 /** @interface_method_impl{PDMAPICHLPR3,pfnBusBroadcastEoi} */ 271 static DECLCALLBACK(void) pdmR3ApicHlp_BusBroadcastEoi(PPDMDEVINS pDevIns, uint8_t u8Vector) 272 { 273 /* pfnSetEoi will be NULL in the old IOAPIC code as it's not implemented. */ 274 #ifdef VBOX_WITH_NEW_IOAPIC 275 PDMDEV_ASSERT_DEVINS(pDevIns); 276 PVM pVM = pDevIns->Internal.s.CTX_SUFF(pVM); 277 278 /* At present, we support only a maximum of one I/O APIC for a VM. If we ever implement having 279 multiple I/O APICs per-VM, we'll have to broadcast this EOI to all of the I/O APICs. */ 280 if (pVM->pdm.s.IoApic.CTX_SUFF(pDevIns)) 281 { 282 Assert(pVM->pdm.s.IoApic.CTX_SUFF(pfnSetEoi)); 283 pdmLock(pVM); 284 pVM->pdm.s.IoApic.CTX_SUFF(pfnSetEoi)(pVM->pdm.s.IoApic.CTX_SUFF(pDevIns), u8Vector); 285 pdmUnlock(pVM); 286 } 287 #endif 288 } 289 290 291 270 292 /** @interface_method_impl{PDMAPICHLPR3,pfnCalcIrqTag} */ 271 293 static DECLCALLBACK(uint32_t) pdmR3ApicHlp_CalcIrqTag(PPDMDEVINS pDevIns, uint8_t u8Level) … … 431 453 pdmR3ApicHlp_SetInterruptFF, 432 454 pdmR3ApicHlp_ClearInterruptFF, 455 pdmR3ApicHlp_BusBroadcastEoi, 433 456 pdmR3ApicHlp_CalcIrqTag, 434 457 pdmR3ApicHlp_ChangeFeature, -
trunk/src/VBox/VMM/VMMRC/PDMRCDevice.cpp
r60804 r61339 560 560 561 561 562 /** @interface_method_impl{PDMAPICHLPRC,pfnBusBroadcastEoi} */ 563 static DECLCALLBACK(void) pdmRCApicHlp_BusBroadcastEoi(PPDMDEVINS pDevIns, uint8_t u8Vector) 564 { 565 /* pfnSetEoi will be NULL in the old IOAPIC code as it's not implemented. */ 566 #ifdef VBOX_WITH_NEW_IOAPIC 567 PDMDEV_ASSERT_DEVINS(pDevIns); 568 PVM pVM = pDevIns->Internal.s.CTX_SUFF(pVM); 569 570 /* At present, we support only a maximum of one I/O APIC for a VM. If we ever implement having 571 multiple I/O APICs per-VM, we'll have to broadcast this EOI to all of the I/O APICs. */ 572 if (pVM->pdm.s.IoApic.CTX_SUFF(pDevIns)) 573 { 574 Assert(pVM->pdm.s.IoApic.CTX_SUFF(pfnSetEoi)); 575 pdmLock(pVM); 576 pVM->pdm.s.IoApic.CTX_SUFF(pfnSetEoi)(pVM->pdm.s.IoApic.CTX_SUFF(pDevIns), u8Vector); 577 pdmUnlock(pVM); 578 } 579 #endif 580 } 581 582 562 583 /** @interface_method_impl{PDMAPICHLPRC,pfnCalcIrqTag} */ 563 584 static DECLCALLBACK(uint32_t) pdmRCApicHlp_CalcIrqTag(PPDMDEVINS pDevIns, uint8_t u8Level) … … 639 660 pdmRCApicHlp_SetInterruptFF, 640 661 pdmRCApicHlp_ClearInterruptFF, 662 pdmRCApicHlp_BusBroadcastEoi, 641 663 pdmRCApicHlp_CalcIrqTag, 642 664 pdmRCApicHlp_ChangeFeature, -
trunk/src/VBox/VMM/include/PDMInternal.h
r60716 r61339 658 658 /** @copydoc PDMIOAPICREG::pfnSendMsiR3 */ 659 659 DECLR3CALLBACKMEMBER(void, pfnSendMsiR3,(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue, uint32_t uTagSrc)); 660 /** @copydoc PDMIOAPICREG::pfnSetEoiR3 */ 661 DECLR3CALLBACKMEMBER(void, pfnSetEoiR3,(PPDMDEVINS pDevIns, uint8_t u8Vector)); 660 662 661 663 /** Pointer to the PIC device instance - R0. */ … … 665 667 /** @copydoc PDMIOAPICREG::pfnSendMsiR3 */ 666 668 DECLR0CALLBACKMEMBER(void, pfnSendMsiR0,(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue, uint32_t uTagSrc)); 669 /** @copydoc PDMIOAPICREG::pfnSetEoiR3 */ 670 DECLR0CALLBACKMEMBER(void, pfnSetEoiR0,(PPDMDEVINS pDevIns, uint8_t u8Vector)); 667 671 668 672 /** Pointer to the APIC device instance - RC Ptr. */ … … 672 676 /** @copydoc PDMIOAPICREG::pfnSendMsiR3 */ 673 677 DECLRCCALLBACKMEMBER(void, pfnSendMsiRC,(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue, uint32_t uTagSrc)); 674 675 uint8_t Alignment[4];678 /** @copydoc PDMIOAPICREG::pfnSendMsiR3 */ 679 DECLRCCALLBACKMEMBER(void, pfnSetEoiRC,(PPDMDEVINS pDevIns, uint8_t u8Vector)); 676 680 } PDMIOAPIC; 677 681
Note:
See TracChangeset
for help on using the changeset viewer.