VirtualBox

Changeset 61339 in vbox


Ignore:
Timestamp:
May 31, 2016 2:23:24 PM (9 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
107634
Message:

VMM, Devices: Added new I/O APIC implementation.

Location:
trunk
Files:
1 added
18 edited

Legend:

Unmodified
Added
Removed
  • trunk/Config.kmk

    r61332 r61339  
    401401# Enables the new APIC code.
    402402VBOX_WITH_NEW_APIC = 1
     403# Enables the new I/O APIC code.
     404#VBOX_WITH_NEW_IOAPIC = 1
    403405## @}
    404406
  • trunk/include/VBox/vmm/pdmdev.h

    r60804 r61339  
    14031403
    14041404    /**
     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    /**
    14051414     * Calculates an IRQ tag for a timer, IPI or similar event.
    14061415     *
     
    14521461
    14531462/** 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)
    14551464
    14561465
     
    14801489     */
    14811490    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));
    14821500
    14831501    /**
     
    15311549
    15321550/** 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)
    15341552
    15351553/**
     
    15581576     */
    15591577    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));
    15601587
    15611588    /**
     
    16561683
    16571684/** 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)
    16591686
    16601687
     
    16681695
    16691696    /**
    1670      * Set the an IRQ.
     1697     * Set an IRQ.
    16711698     *
    16721699     * @param   pDevIns         Device instance of the I/O APIC.
     
    17001727    /** The name of the R0 SendMsi entry point. */
    17011728    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;
    17021744} PDMIOAPICREG;
    17031745/** Pointer to an APIC registration structure. */
     
    17051747
    17061748/** 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)
    17081750
    17091751
  • trunk/src/VBox/Devices/Makefile.kmk

    r61332 r61339  
    117117        VBOX_HGCM_HOST_CODE \
    118118        $(if $(VBOX_WITH_HGCM),VBOX_WITH_HGCM,) \
     119        $(if $(VBOX_WITH_NEW_IOAPIC),VBOX_WITH_NEW_IOAPIC,) \
    119120        $(if $(VBOX_BIOS_DMI_FALLBACK),VBOX_BIOS_DMI_FALLBACK,) \
    120121        VBOX_WITH_DMI_CHASSIS \
     
    159160        PC/DevDMA.cpp \
    160161        PC/DevHPET.cpp \
     162        $(if $(VBOX_WITH_NEW_IOAPIC),PC/DevIOAPIC_New.cpp,) \
    161163        Storage/DevFdc.cpp \
    162164        Serial/DevSerial.cpp \
     
    880882  VBoxDDRC_INCS           = build
    881883  VBoxDDRC_SOURCES        = \
    882         Audio/DevIchHda.cpp \
     884        Audio/DevIchHda.cpp \
    883885        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 \
    888890        Graphics/DevVGA.cpp \
    889891        Input/DevPS2.cpp \
    890         Input/PS2K.cpp \
    891         Input/PS2M.cpp \
     892        Input/PS2K.cpp \
     893        Input/PS2M.cpp \
    892894        PC/DevACPI.cpp \
     895        $(if $(VBOX_WITH_NEW_IOAPIC),PC/DevIOAPIC_New.cpp,) \
    893896        PC/DevPit-i8254.cpp \
    894897        PC/DevPIC.cpp \
    895898        PC/DevRTC.cpp \
    896         PC/DevHPET.cpp \
     899        PC/DevHPET.cpp \
    897900        Storage/DevATA.cpp \
    898901        Network/DevPCNet.cpp \
    899902        Serial/DevSerial.cpp \
    900903        Parallel/DevParallel.cpp \
    901         VMMDev/VMMDevTesting.cpp
     904        VMMDev/VMMDevTesting.cpp
    902905
    903906  ifdef VBOX_WITH_E1000
     
    10141017 VBoxDD2_SOURCES         = \
    10151018        build/VBoxDD2.cpp  \
    1016         PC/DevIoApic.cpp \
    10171019        PC/DevLPC.cpp
    10181020 ifndef VBOX_WITH_NEW_APIC
    10191021  VBoxDD2_SOURCES += PC/DevAPIC.cpp
     1022 endif
     1023 ifndef VBOX_WITH_NEW_IOAPIC
     1024  VBoxDD2_SOURCES += PC/DevIoApic.cpp
    10201025 endif
    10211026 VBoxDD2_LIBS            = \
     
    10381043  VBoxDD2_DEFS          += VBOX_WITH_NEW_APIC
    10391044 endif
     1045 ifdef VBOX_WITH_NEW_IOAPIC
     1046  VBoxDD2_DEFS          += VBOX_WITH_NEW_IOAPIC
     1047 endif
    10401048
    10411049 $(call VBOX_SET_VER_INFO_DLL,VBoxDD2,VirtualBox VMM Devices and Drivers 2) # (last!)
     
    10561064        Bus/MsiCommon.cpp \
    10571065        Bus/MsixCommon.cpp \
    1058         EFI/DevSmc.cpp \
     1066        EFI/DevSmc.cpp \
    10591067        Graphics/DevVGA.cpp \
    10601068        Input/DevPS2.cpp \
     
    10621070        Input/PS2M.cpp \
    10631071        PC/DevACPI.cpp \
     1072        $(if $(VBOX_WITH_NEW_IOAPIC),PC/DevIOAPIC_New.cpp,) \
    10641073        PC/DevPit-i8254.cpp \
    10651074        PC/DevPIC.cpp \
  • trunk/src/VBox/Devices/PC/DevIoApic.cpp

    r60635 r61339  
    797797    IoApicReg.pszSendMsiRC = fRZEnabled ? "ioapicSendMsi" : NULL;
    798798    IoApicReg.pszSendMsiR0 = fRZEnabled ? "ioapicSendMsi" : NULL;
     799    IoApicReg.pfnSetEoiR3  = NULL;
     800    IoApicReg.pszSetEoiR0  = NULL;
     801    IoApicReg.pszSetEoiRC  = NULL;
    799802
    800803    rc = PDMDevHlpIOAPICRegister(pDevIns, &IoApicReg, &pThis->pIoApicHlpR3);
  • trunk/src/VBox/Devices/build/VBoxDD.cpp

    r61320 r61339  
    6666    if (RT_FAILURE(rc))
    6767        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
    6873    rc = pCallbacks->pfnRegister(pCallbacks, &g_DevicePS2KeyboardMouse);
    6974    if (RT_FAILURE(rc))
  • trunk/src/VBox/Devices/build/VBoxDD.h

    r59248 r61339  
    3333extern const PDMDEVREG g_DevicePcArch;
    3434extern const PDMDEVREG g_DevicePcBios;
     35#ifdef VBOX_WITH_NEW_IOAPIC
     36extern const PDMDEVREG g_DeviceIOAPIC;
     37#endif
    3538extern const PDMDEVREG g_DevicePS2KeyboardMouse;
    3639extern const PDMDEVREG g_DeviceI8254;
  • trunk/src/VBox/Devices/build/VBoxDD2.cpp

    r60422 r61339  
    6868        return rc;
    6969#endif
     70#ifndef VBOX_WITH_NEW_IOAPIC
    7071    rc = pCallbacks->pfnRegister(pCallbacks, &g_DeviceIOAPIC);
    7172    if (RT_FAILURE(rc))
    7273        return rc;
     74#endif
    7375    rc = pCallbacks->pfnRegister(pCallbacks, &g_DeviceLPC);
    7476    if (RT_FAILURE(rc))
  • trunk/src/VBox/Devices/build/VBoxDD2.h

    r60422 r61339  
    6464extern const PDMDEVREG g_DeviceAPIC;
    6565#endif
     66#ifndef VBOX_WITH_NEW_IOAPIC
    6667extern const PDMDEVREG g_DeviceIOAPIC;
     68#endif
    6769extern const PDMDEVREG g_DeviceLPC;
    6870
  • trunk/src/VBox/Devices/testcase/Makefile.kmk

    r60307 r61339  
    3636        $(if $(VBOX_WITH_LSILOGIC),VBOX_WITH_LSILOGIC,) \
    3737        $(if $(VBOX_WITH_NEW_APIC),VBOX_WITH_NEW_APIC,) \
     38        $(if $(VBOX_WITH_NEW_IOAPIC),VBOX_WITH_NEW_IOAPIC,) \
    3839        $(if $(VBOX_WITH_NEW_PS2M),VBOX_WITH_NEW_PS2M,) \
    3940        $(if $(VBOX_WITH_NVME_IMPL),VBOX_WITH_NVME_IMPL,) \
  • trunk/src/VBox/Devices/testcase/tstDeviceStructSize.cpp

    r60855 r61339  
    6565#endif
    6666#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
    6872#undef LOG_GROUP
    6973#include "../PC/DevHPET.cpp"
     
    332336#endif
    333337    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
    335345    CHECK_MEMBER_ALIGNMENT(IOAPIC, StatMMIOReadGC, 8);
    336346    CHECK_MEMBER_ALIGNMENT(IOAPIC, StatMMIOReadGC, 8);
     347# endif
    337348#endif
    338349    CHECK_MEMBER_ALIGNMENT(LSILOGISCSI, GCPhysMMIOBase, 8);
  • trunk/src/VBox/Devices/testcase/tstDeviceStructSizeRC.cpp

    r61150 r61339  
    6767#endif
    6868#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
    7074#undef LOG_GROUP
    7175#include "../Storage/DevATA.cpp"
     
    866870#endif  /* VBOX_WITH_NEW_APIC */
    867871
     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
    868901    /* PC/DevIoApic.cpp */
    869902    GEN_CHECK_SIZE(IOAPIC);
     
    880913    GEN_CHECK_OFF(IOAPIC, pDevInsRC);
    881914    GEN_CHECK_OFF(IOAPIC, pIoApicHlpRC);
    882 #ifdef VBOX_WITH_STATISTICS
     915# ifdef VBOX_WITH_STATISTICS
    883916    GEN_CHECK_OFF(IOAPIC, StatMMIOReadGC);
    884917    GEN_CHECK_OFF(IOAPIC, StatSetIrqHC);
    885 #endif
     918# endif
     919#endif /* VBOX_WITH_NEW_IOAPIC */
    886920
    887921    /* Storage/DevATA.cpp */
  • trunk/src/VBox/VMM/Makefile.kmk

    r61068 r61339  
    9090ifdef VBOX_WITH_NEW_APIC
    9191 VMM_COMMON_DEFS += VBOX_WITH_NEW_APIC
     92endif
     93ifdef VBOX_WITH_NEW_IOAPIC
     94 VMM_COMMON_DEFS += VBOX_WITH_NEW_IOAPIC
    9295endif
    9396
  • trunk/src/VBox/VMM/VMMAll/APICAll.cpp

    r61324 r61339  
    462462    uint8_t *pbXApic = (uint8_t *)pXApicPage;
    463463    *(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 */
     473DECLINLINE(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);
    464478}
    465479
     
    11941208        if (fLevelTriggered)
    11951209        {
    1196             /** @todo We need to broadcast EOI to IO APICs here. */
    11971210            apicClearVectorInReg(&pXApicPage->tmr, uVector);
     1211            apicBusBroadcastEoi(pVCpu, uVector);
    11981212            Log2(("APIC%u: apicSetEoi: Cleared level triggered interrupt from TMR. uVector=%#x\n", pVCpu->idCpu, uVector));
    11991213        }
  • trunk/src/VBox/VMM/VMMR0/PDMR0Device.cpp

    r60804 r61339  
    605605
    606606
     607/** @interface_method_impl{PDMAPICHLPR0,pfnBusBroadcastEoi} */
     608static 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
    607628/** @interface_method_impl{PDMAPICHLPR0,pfnCalcIrqTag} */
    608629static DECLCALLBACK(uint32_t) pdmR0ApicHlp_CalcIrqTag(PPDMDEVINS pDevIns, uint8_t u8Level)
     
    684705    pdmR0ApicHlp_SetInterruptFF,
    685706    pdmR0ApicHlp_ClearInterruptFF,
     707    pdmR0ApicHlp_BusBroadcastEoi,
    686708    pdmR0ApicHlp_CalcIrqTag,
    687709    pdmR0ApicHlp_ChangeFeature,
  • trunk/src/VBox/VMM/VMMR3/PDMDevHlp.cpp

    r60716 r61339  
    26132613static DECLCALLBACK(int) pdmR3DevHlp_APICRegister(PPDMDEVINS pDevIns, PPDMAPICREG pApicReg, PCPDMAPICHLPR3 *ppApicHlpR3)
    26142614{
    2615 #if 0
    2616 #ifdef VBOX_WITH_NEW_APIC
    2617     PDMDEV_ASSERT_DEVINS(pDevIns);
    2618     VM_ASSERT_EMT(pDevIns->Internal.s.pVMR3);
    2619     NOREF(pApicReg);
    2620     *ppApicHlpR3 = &g_pdmR3DevApicHlp;
    2621     return VINF_SUCCESS;
    2622 #endif
    2623 #endif
    2624 
    26252615    PDMDEV_ASSERT_DEVINS(pDevIns);
    26262616    VM_ASSERT_EMT(pDevIns->Internal.s.pVMR3);
     
    29462936        return VERR_INVALID_PARAMETER;
    29472937    }
    2948     if (!pIoApicReg->pfnSetIrqR3 || !pIoApicReg->pfnSendMsiR3)
     2938    if (!pIoApicReg->pfnSetIrqR3 || !pIoApicReg->pfnSendMsiR3
     2939#ifdef VBOX_WITH_NEW_IOAPIC
     2940        || !pIoApicReg->pfnSetEoiR3
     2941#endif
     2942        )
    29492943    {
    29502944        Assert(pIoApicReg->pfnSetIrqR3);
     
    29662960        return VERR_INVALID_PARAMETER;
    29672961    }
     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    }
    29682969    if (    pIoApicReg->pszSetIrqR0
    29692970        &&  !VALID_PTR(pIoApicReg->pszSetIrqR0))
     
    29772978    {
    29782979        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));
    29792987        LogFlow(("pdmR3DevHlp_IOAPICRegister: caller='%s'/%d: returns %Rrc (GC callbacks)\n", pDevIns->pReg->szName, pDevIns->iInstance, VERR_INVALID_PARAMETER));
    29802988        return VERR_INVALID_PARAMETER;
     
    30383046    if (pIoApicReg->pszSendMsiRC)
    30393047    {
    3040         int rc = pdmR3DevGetSymbolRCLazy(pDevIns, pIoApicReg->pszSetIrqRC, &pVM->pdm.s.IoApic.pfnSendMsiRC);
     3048        int rc = pdmR3DevGetSymbolRCLazy(pDevIns, pIoApicReg->pszSendMsiRC, &pVM->pdm.s.IoApic.pfnSendMsiRC);
    30413049        AssertMsgRC(rc, ("%s::%s rc=%Rrc\n", pDevIns->pReg->szRCMod, pIoApicReg->pszSendMsiRC, rc));
    30423050        if (RT_FAILURE(rc))
     
    30493057    {
    30503058        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;
    30513074    }
    30523075
     
    30873110    }
    30883111
     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
    30893127
    30903128    /*
     
    30923130     */
    30933131    pVM->pdm.s.IoApic.pDevInsR3   = pDevIns;
    3094     pVM->pdm.s.IoApic.pfnSetIrqR3 = pIoApicReg->pfnSetIrqR3;
     3132    pVM->pdm.s.IoApic.pfnSetIrqR3  = pIoApicReg->pfnSetIrqR3;
    30953133    pVM->pdm.s.IoApic.pfnSendMsiR3 = pIoApicReg->pfnSendMsiR3;
     3134    pVM->pdm.s.IoApic.pfnSetEoiR3  = pIoApicReg->pfnSetEoiR3;
    30963135    Log(("PDM: Registered I/O APIC device '%s'/%d pDevIns=%p\n", pDevIns->pReg->szName, pDevIns->iInstance, pDevIns));
    30973136
  • trunk/src/VBox/VMM/VMMR3/PDMDevMiscHlp.cpp

    r60804 r61339  
    268268
    269269
     270/** @interface_method_impl{PDMAPICHLPR3,pfnBusBroadcastEoi} */
     271static 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
    270292/** @interface_method_impl{PDMAPICHLPR3,pfnCalcIrqTag} */
    271293static DECLCALLBACK(uint32_t) pdmR3ApicHlp_CalcIrqTag(PPDMDEVINS pDevIns, uint8_t u8Level)
     
    431453    pdmR3ApicHlp_SetInterruptFF,
    432454    pdmR3ApicHlp_ClearInterruptFF,
     455    pdmR3ApicHlp_BusBroadcastEoi,
    433456    pdmR3ApicHlp_CalcIrqTag,
    434457    pdmR3ApicHlp_ChangeFeature,
  • trunk/src/VBox/VMM/VMMRC/PDMRCDevice.cpp

    r60804 r61339  
    560560
    561561
     562/** @interface_method_impl{PDMAPICHLPRC,pfnBusBroadcastEoi} */
     563static 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
    562583/** @interface_method_impl{PDMAPICHLPRC,pfnCalcIrqTag} */
    563584static DECLCALLBACK(uint32_t) pdmRCApicHlp_CalcIrqTag(PPDMDEVINS pDevIns, uint8_t u8Level)
     
    639660    pdmRCApicHlp_SetInterruptFF,
    640661    pdmRCApicHlp_ClearInterruptFF,
     662    pdmRCApicHlp_BusBroadcastEoi,
    641663    pdmRCApicHlp_CalcIrqTag,
    642664    pdmRCApicHlp_ChangeFeature,
  • trunk/src/VBox/VMM/include/PDMInternal.h

    r60716 r61339  
    658658    /** @copydoc PDMIOAPICREG::pfnSendMsiR3 */
    659659    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));
    660662
    661663    /** Pointer to the PIC device instance - R0. */
     
    665667    /** @copydoc PDMIOAPICREG::pfnSendMsiR3 */
    666668    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));
    667671
    668672    /** Pointer to the APIC device instance - RC Ptr. */
     
    672676     /** @copydoc PDMIOAPICREG::pfnSendMsiR3 */
    673677    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));
    676680} PDMIOAPIC;
    677681
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette