VirtualBox

Changeset 82039 in vbox


Ignore:
Timestamp:
Nov 20, 2019 5:22:21 PM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
134843
Message:

APIC,PDM: Split up APIC 'registration'. bugref:9218

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/vmm/pdmdev.h

    r81961 r82039  
    37423742     * @param   pDevIns             The device instance.
    37433743     */
    3744     DECLR3CALLBACKMEMBER(int, pfnAPICRegister,(PPDMDEVINS pDevIns));
     3744    DECLR3CALLBACKMEMBER(int, pfnApicRegister,(PPDMDEVINS pDevIns));
    37453745
    37463746    /**
     
    51755175
    51765176    /**
     5177     * Sets up the APIC for the ring-0 context.
     5178     *
     5179     * This must be called after ring-3 has registered the APIC using
     5180     * PDMDevHlpApicRegister().
     5181     *
     5182     * @returns VBox status code.
     5183     * @param   pDevIns     The device instance.
     5184     */
     5185    DECLR0CALLBACKMEMBER(int, pfnApicSetUpContext,(PPDMDEVINS pDevIns));
     5186
     5187    /**
    51775188     * Sets up the IOAPIC for the ring-0 context.
    51785189     *
     
    52255236
    52265237/** Current PDMDEVHLP version number. */
    5227 #define PDM_DEVHLPR0_VERSION                    PDM_VERSION_MAKE(0xffe5, 14, 0)
     5238#define PDM_DEVHLPR0_VERSION                    PDM_VERSION_MAKE(0xffe5, 15, 0)
    52285239
    52295240
     
    77047715
    77057716/**
    7706  * @copydoc PDMDEVHLPR3::pfnAPICRegister
    7707  */
    7708 DECLINLINE(int) PDMDevHlpAPICRegister(PPDMDEVINS pDevIns)
    7709 {
    7710     return pDevIns->pHlpR3->pfnAPICRegister(pDevIns);
     7717 * @copydoc PDMDEVHLPR3::pfnApicRegister
     7718 */
     7719DECLINLINE(int) PDMDevHlpApicRegister(PPDMDEVINS pDevIns)
     7720{
     7721    return pDevIns->pHlpR3->pfnApicRegister(pDevIns);
    77117722}
    77127723
     
    78577868{
    78587869    return pDevIns->CTX_SUFF(pHlp)->pfnPICSetUpContext(pDevIns, pPicReg, ppPicHlp);
     7870}
     7871
     7872/**
     7873 * @copydoc PDMDEVHLPR0::pfnApicSetUpContext
     7874 */
     7875DECLINLINE(int) PDMDevHlpApicSetUpContext(PPDMDEVINS pDevIns)
     7876{
     7877    return pDevIns->CTX_SUFF(pHlp)->pfnApicSetUpContext(pDevIns);
    78597878}
    78607879
  • trunk/src/VBox/VMM/VMMAll/APICAll.cpp

    r82038 r82039  
    35153515    AssertRCReturn(rc, rc);
    35163516
     3517    rc = PDMDevHlpApicSetUpContext(pDevIns);
     3518    AssertRCReturn(rc, rc);
     3519
    35173520    rc = PDMDevHlpMmioSetUpContext(pDevIns, pThis->hMmio, apicWriteMmio, apicReadMmio, NULL /*pvUser*/);
    35183521    AssertRCReturn(rc, rc);
     
    35203523    return VINF_SUCCESS;
    35213524}
    3522 #endif
     3525#endif /* !IN_RING3 */
    35233526
    35243527/**
  • trunk/src/VBox/VMM/VMMR0/PDMR0Device.cpp

    r81961 r82039  
    11401140    *ppPicHlp = &g_pdmR0PicHlp;
    11411141    LogFlow(("pdmR0DevHlp_PICSetUpContext: caller='%s'/%d: returns %Rrc\n", pDevIns->pReg->szName, pDevIns->iInstance, VINF_SUCCESS));
     1142    return VINF_SUCCESS;
     1143}
     1144
     1145
     1146/** @interface_method_impl{PDMDEVHLPR0,pfnApicSetUpContext} */
     1147static DECLCALLBACK(int) pdmR0DevHlp_ApicSetUpContext(PPDMDEVINS pDevIns)
     1148{
     1149    PDMDEV_ASSERT_DEVINS(pDevIns);
     1150    LogFlow(("pdmR0DevHlp_ApicSetUpContext: caller='%s'/%d:\n", pDevIns->pReg->szName, pDevIns->iInstance));
     1151    PGVM pGVM = pDevIns->Internal.s.pGVM;
     1152
     1153    /*
     1154     * Validate input.
     1155     */
     1156    VM_ASSERT_STATE_RETURN(pGVM, VMSTATE_CREATING, VERR_WRONG_ORDER);
     1157    VM_ASSERT_EMT0_RETURN(pGVM, VERR_VM_THREAD_NOT_EMT);
     1158
     1159    /* Check that it's the same device as made the ring-3 registrations: */
     1160    AssertLogRelMsgReturn(pGVM->pdm.s.Apic.pDevInsR3 == pDevIns->pDevInsForR3,
     1161                          ("%p vs %p\n", pGVM->pdm.s.Apic.pDevInsR3, pDevIns->pDevInsForR3), VERR_NOT_OWNER);
     1162
     1163    /* Check that it isn't already registered in ring-0: */
     1164    AssertLogRelMsgReturn(pGVM->pdm.s.Apic.pDevInsR0 == NULL, ("%p (caller pDevIns=%p)\n", pGVM->pdm.s.Apic.pDevInsR0, pDevIns),
     1165                          VERR_ALREADY_EXISTS);
     1166
     1167    /*
     1168     * Take down the instance.
     1169     */
     1170    pGVM->pdm.s.Apic.pDevInsR0 = pDevIns;
     1171    Log(("PDM: Registered APIC device '%s'/%d pDevIns=%p\n", pDevIns->pReg->szName, pDevIns->iInstance, pDevIns));
     1172
     1173    /* set the helper pointer and return. */
     1174    LogFlow(("pdmR0DevHlp_ApicSetUpContext: caller='%s'/%d: returns %Rrc\n", pDevIns->pReg->szName, pDevIns->iInstance, VINF_SUCCESS));
    11421175    return VINF_SUCCESS;
    11431176}
     
    13101343    pdmR0DevHlp_PCIBusSetUpContext,
    13111344    pdmR0DevHlp_PICSetUpContext,
     1345    pdmR0DevHlp_ApicSetUpContext,
    13121346    pdmR0DevHlp_IoApicSetUpContext,
    13131347    pdmR0DevHlp_HpetSetUpContext,
  • trunk/src/VBox/VMM/VMMR3/APIC.cpp

    r82036 r82039  
    14431443     * Register the APIC with PDM.
    14441444     */
    1445     rc = PDMDevHlpAPICRegister(pDevIns);
     1445    rc = PDMDevHlpApicRegister(pDevIns);
    14461446    AssertLogRelRCReturn(rc, rc);
    14471447
  • trunk/src/VBox/VMM/VMMR3/PDMDevHlp.cpp

    r82034 r82039  
    37143714
    37153715/** @interface_method_impl{PDMDEVHLPR3,pfnAPICRegister} */
    3716 static DECLCALLBACK(int) pdmR3DevHlp_APICRegister(PPDMDEVINS pDevIns)
    3717 {
    3718     PDMDEV_ASSERT_DEVINS(pDevIns);
    3719     VM_ASSERT_EMT(pDevIns->Internal.s.pVMR3);
     3716static DECLCALLBACK(int) pdmR3DevHlp_ApicRegister(PPDMDEVINS pDevIns)
     3717{
     3718    PDMDEV_ASSERT_DEVINS(pDevIns);
     3719
     3720    /*
     3721     * Validate caller context.
     3722     */
     3723    PVM pVM = pDevIns->Internal.s.pVMR3;
     3724    VM_ASSERT_STATE_RETURN(pVM, VMSTATE_CREATING, VERR_WRONG_ORDER);
     3725    VM_ASSERT_EMT0_RETURN(pVM, VERR_VM_THREAD_NOT_EMT);
    37203726
    37213727    /*
     
    37233729     * as they need to communicate and share state easily.
    37243730     */
    3725     PVM pVM = pDevIns->Internal.s.pVMR3;
    3726     if (pVM->pdm.s.Apic.pDevInsR3)
    3727     {
    3728         AssertMsgFailed(("Only one APIC device is supported!\n"));
    3729         LogFlow(("pdmR3DevHlp_APICRegister: caller='%s'/%d: returns %Rrc\n", pDevIns->pReg->szName, pDevIns->iInstance, VERR_INVALID_PARAMETER));
    3730         return VERR_INVALID_PARAMETER;
    3731     }
    3732 
    3733     /*
    3734      * Initialize the RC, R0 and HC bits.
    3735      */
     3731    AssertMsgReturn(pVM->pdm.s.Apic.pDevInsR3 == NULL,
     3732                    ("%s/%u: Only one APIC device is supported!\n", pDevIns->pReg->szName, pDevIns->iInstance),
     3733                    VERR_ALREADY_EXISTS);
     3734
     3735    /*
     3736     * Set the ring-3 and raw-mode bits, leave the ring-0 to ring-0 setup.
     3737     */
     3738    pVM->pdm.s.Apic.pDevInsR3 = pDevIns;
    37363739    pVM->pdm.s.Apic.pDevInsRC = PDMDEVINS_2_RCPTR(pDevIns);
    37373740    Assert(pVM->pdm.s.Apic.pDevInsRC || !VM_IS_RAW_MODE_ENABLED(pVM));
    37383741
    3739     pVM->pdm.s.Apic.pDevInsR0 = PDMDEVINS_2_R0PTR(pDevIns);
    3740     Assert(pVM->pdm.s.Apic.pDevInsR0);
    3741 
    3742     pVM->pdm.s.Apic.pDevInsR3 = pDevIns;
    3743     LogFlow(("pdmR3DevHlp_APICRegister: caller='%s'/%d: returns %Rrc\n", pDevIns->pReg->szName, pDevIns->iInstance, VINF_SUCCESS));
     3742    LogFlow(("pdmR3DevHlp_ApicRegister: caller='%s'/%d: returns %Rrc\n", pDevIns->pReg->szName, pDevIns->iInstance, VINF_SUCCESS));
    37443743    return VINF_SUCCESS;
    37453744}
     
    45514550    pdmR3DevHlp_PCIBusRegister,
    45524551    pdmR3DevHlp_PICRegister,
    4553     pdmR3DevHlp_APICRegister,
     4552    pdmR3DevHlp_ApicRegister,
    45544553    pdmR3DevHlp_IoApicRegister,
    45554554    pdmR3DevHlp_HpetRegister,
     
    50475046    pdmR3DevHlp_PCIBusRegister,
    50485047    pdmR3DevHlp_PICRegister,
    5049     pdmR3DevHlp_APICRegister,
     5048    pdmR3DevHlp_ApicRegister,
    50505049    pdmR3DevHlp_IoApicRegister,
    50515050    pdmR3DevHlp_HpetRegister,
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