VirtualBox

Changeset 81961 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Nov 18, 2019 7:06:25 PM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
134758
Message:

DevHPET,PDM: Split structures and refactored registration. bugref:9218

Location:
trunk/src/VBox/VMM
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR0/PDMR0Device.cpp

    r81938 r81961  
    11891189    *ppIoApicHlp = &g_pdmR0IoApicHlp;
    11901190    LogFlow(("pdmR0DevHlp_IoApicSetUpContext: caller='%s'/%d: returns %Rrc\n", pDevIns->pReg->szName, pDevIns->iInstance, VINF_SUCCESS));
     1191    return VINF_SUCCESS;
     1192}
     1193
     1194
     1195/** @interface_method_impl{PDMDEVHLPR0,pfnHpetSetUpContext} */
     1196static DECLCALLBACK(int) pdmR0DevHlp_HpetSetUpContext(PPDMDEVINS pDevIns, PPDMHPETREG pHpetReg, PCPDMHPETHLPR0 *ppHpetHlp)
     1197{
     1198    PDMDEV_ASSERT_DEVINS(pDevIns);
     1199    LogFlow(("pdmR0DevHlp_HpetSetUpContext: caller='%s'/%d: pHpetReg=%p:{.u32Version=%#x, } ppHpetHlp=%p\n",
     1200             pDevIns->pReg->szName, pDevIns->iInstance, pHpetReg, pHpetReg->u32Version, ppHpetHlp));
     1201    PGVM pGVM = pDevIns->Internal.s.pGVM;
     1202
     1203    /*
     1204     * Validate input.
     1205     */
     1206    AssertMsgReturn(pHpetReg->u32Version == PDM_HPETREG_VERSION,
     1207                    ("%s/%d: u32Version=%#x expected %#x\n", pDevIns->pReg->szName, pDevIns->iInstance, pHpetReg->u32Version, PDM_HPETREG_VERSION),
     1208                    VERR_VERSION_MISMATCH);
     1209    AssertPtrReturn(ppHpetHlp, VERR_INVALID_POINTER);
     1210
     1211    VM_ASSERT_STATE_RETURN(pGVM, VMSTATE_CREATING, VERR_WRONG_ORDER);
     1212    VM_ASSERT_EMT0_RETURN(pGVM, VERR_VM_THREAD_NOT_EMT);
     1213
     1214    /* Check that it's the same device as made the ring-3 registrations: */
     1215    AssertLogRelMsgReturn(pGVM->pdm.s.pHpet == pDevIns->pDevInsForR3, ("%p vs %p\n", pGVM->pdm.s.pHpet, pDevIns->pDevInsForR3),
     1216                          VERR_NOT_OWNER);
     1217
     1218    ///* Check that it isn't already registered in ring-0: */
     1219    //AssertLogRelMsgReturn(pGVM->pdm.s.Hpet.pDevInsR0 == NULL, ("%p (caller pDevIns=%p)\n", pGVM->pdm.s.Hpet.pDevInsR0, pDevIns),
     1220    //                      VERR_ALREADY_EXISTS);
     1221
     1222    /*
     1223     * Nothing to take down here at present.
     1224     */
     1225    Log(("PDM: Registered HPET device '%s'/%d pDevIns=%p\n", pDevIns->pReg->szName, pDevIns->iInstance, pDevIns));
     1226
     1227    /* set the helper pointer and return. */
     1228    *ppHpetHlp = &g_pdmR0HpetHlp;
     1229    LogFlow(("pdmR0DevHlp_HpetSetUpContext: caller='%s'/%d: returns %Rrc\n", pDevIns->pReg->szName, pDevIns->iInstance, VINF_SUCCESS));
    11911230    return VINF_SUCCESS;
    11921231}
     
    12721311    pdmR0DevHlp_PICSetUpContext,
    12731312    pdmR0DevHlp_IoApicSetUpContext,
     1313    pdmR0DevHlp_HpetSetUpContext,
    12741314    NULL /*pfnReserved1*/,
    12751315    NULL /*pfnReserved2*/,
  • trunk/src/VBox/VMM/VMMR3/PDMDevHlp.cpp

    r81951 r81961  
    37423742{
    37433743    PDMDEV_ASSERT_DEVINS(pDevIns);
    3744     VM_ASSERT_EMT(pDevIns->Internal.s.pVMR3);
    37453744    LogFlow(("pdmR3DevHlp_IoApicRegister: caller='%s'/%d: pIoApicReg=%p:{.u32Version=%#x, .pfnSetIrq=%p, .pfnSendMsi=%p, .pfnSetEoi=%p, .u32TheEnd=%#x } ppIoApicHlp=%p\n",
    37463745             pDevIns->pReg->szName, pDevIns->iInstance, pIoApicReg, pIoApicReg->u32Version, pIoApicReg->pfnSetIrq, pIoApicReg->pfnSendMsi, pIoApicReg->pfnSetEoi, pIoApicReg->u32TheEnd, ppIoApicHlp));
     3746    PVM pVM = pDevIns->Internal.s.pVMR3;
    37473747
    37483748    /*
     
    37593759                    VERR_VERSION_MISMATCH);
    37603760    AssertPtrReturn(ppIoApicHlp, VERR_INVALID_POINTER);
     3761    VM_ASSERT_STATE_RETURN(pVM, VMSTATE_CREATING, VERR_WRONG_ORDER);
     3762    VM_ASSERT_EMT0_RETURN(pVM, VERR_VM_THREAD_NOT_EMT);
    37613763
    37623764    /*
     
    37643766     * If the I/O APIC does GC stuff so must the APIC.
    37653767     */
    3766     PVM pVM = pDevIns->Internal.s.pVMR3;
    37673768    AssertMsgReturn(pVM->pdm.s.Apic.pDevInsR3 != NULL, ("Configuration error / Init order error! No APIC!\n"), VERR_WRONG_ORDER);
    37683769
     
    37713772     */
    37723773    AssertMsgReturn(pVM->pdm.s.IoApic.pDevInsR3 == NULL,
    3773                     ("Only one ioapic device is supported! (caller %s/%d)\n", pDevIns->pReg->szName, pDevIns->iInstance),
     3774                    ("Only one IOAPIC device is supported! (caller %s/%d)\n", pDevIns->pReg->szName, pDevIns->iInstance),
    37743775                    VERR_ALREADY_EXISTS);
    37753776
     
    37903791
    37913792
    3792 /** @interface_method_impl{PDMDEVHLPR3,pfnHPETRegister} */
    3793 static DECLCALLBACK(int) pdmR3DevHlp_HPETRegister(PPDMDEVINS pDevIns, PPDMHPETREG pHpetReg, PCPDMHPETHLPR3 *ppHpetHlpR3)
    3794 {
    3795     PDMDEV_ASSERT_DEVINS(pDevIns); RT_NOREF_PV(pDevIns);
    3796     VM_ASSERT_EMT(pDevIns->Internal.s.pVMR3);
    3797     LogFlow(("pdmR3DevHlp_HPETRegister: caller='%s'/%d:\n", pDevIns->pReg->szName, pDevIns->iInstance));
     3793/** @interface_method_impl{PDMDEVHLPR3,pfnHpetRegister} */
     3794static DECLCALLBACK(int) pdmR3DevHlp_HpetRegister(PPDMDEVINS pDevIns, PPDMHPETREG pHpetReg, PCPDMHPETHLPR3 *ppHpetHlpR3)
     3795{
     3796    PDMDEV_ASSERT_DEVINS(pDevIns);
     3797    LogFlow(("pdmR3DevHlp_HpetRegister: caller='%s'/%d:\n", pDevIns->pReg->szName, pDevIns->iInstance));
     3798    PVM pVM = pDevIns->Internal.s.pVMR3;
    37983799
    37993800    /*
    38003801     * Validate input.
    38013802     */
    3802     if (pHpetReg->u32Version != PDM_HPETREG_VERSION)
    3803     {
    3804         AssertMsgFailed(("u32Version=%#x expected %#x\n", pHpetReg->u32Version, PDM_HPETREG_VERSION));
    3805         LogFlow(("pdmR3DevHlp_HPETRegister: caller='%s'/%d: returns %Rrc (version)\n", pDevIns->pReg->szName, pDevIns->iInstance, VERR_INVALID_PARAMETER));
    3806         return VERR_INVALID_PARAMETER;
    3807     }
    3808 
    3809     if (!ppHpetHlpR3)
    3810     {
    3811         Assert(ppHpetHlpR3);
    3812         LogFlow(("pdmR3DevHlp_HPETRegister: caller='%s'/%d: returns %Rrc (ppApicHlpR3)\n", pDevIns->pReg->szName, pDevIns->iInstance, VERR_INVALID_PARAMETER));
    3813         return VERR_INVALID_PARAMETER;
    3814     }
    3815 
    3816     /* set the helper pointer and return. */
     3803    AssertMsgReturn(pHpetReg->u32Version == PDM_HPETREG_VERSION,
     3804                    ("%s/%u: u32Version=%#x expected %#x\n", pDevIns->pReg->szName, pDevIns->iInstance, pHpetReg->u32Version, PDM_HPETREG_VERSION),
     3805                    VERR_VERSION_MISMATCH);
     3806    AssertPtrReturn(ppHpetHlpR3, VERR_INVALID_POINTER);
     3807    VM_ASSERT_STATE_RETURN(pVM, VMSTATE_CREATING, VERR_WRONG_ORDER);
     3808    VM_ASSERT_EMT0_RETURN(pVM, VERR_VM_THREAD_NOT_EMT);
     3809
     3810    /*
     3811     * Only one HPET device.
     3812     */
     3813    AssertMsgReturn(pVM->pdm.s.pHpet == NULL,
     3814                    ("Only one HPET device is supported! (caller %s/%d)\n", pDevIns->pReg->szName, pDevIns->iInstance),
     3815                    VERR_ALREADY_EXISTS);
     3816
     3817    /*
     3818     * Do the job (what there is of it).
     3819     */
     3820    pVM->pdm.s.pHpet = pDevIns;
    38173821    *ppHpetHlpR3 = &g_pdmR3DevHpetHlp;
    3818     LogFlow(("pdmR3DevHlp_HPETRegister: caller='%s'/%d: returns %Rrc\n", pDevIns->pReg->szName, pDevIns->iInstance, VINF_SUCCESS));
     3822
     3823    LogFlow(("pdmR3DevHlp_HpetRegister: caller='%s'/%d: returns %Rrc\n", pDevIns->pReg->szName, pDevIns->iInstance, VINF_SUCCESS));
    38193824    return VINF_SUCCESS;
    38203825}
     
    45404545    pdmR3DevHlp_APICRegister,
    45414546    pdmR3DevHlp_IoApicRegister,
    4542     pdmR3DevHlp_HPETRegister,
     4547    pdmR3DevHlp_HpetRegister,
    45434548    pdmR3DevHlp_PciRawRegister,
    45444549    pdmR3DevHlp_DMACRegister,
     
    50365041    pdmR3DevHlp_APICRegister,
    50375042    pdmR3DevHlp_IoApicRegister,
    5038     pdmR3DevHlp_HPETRegister,
     5043    pdmR3DevHlp_HpetRegister,
    50395044    pdmR3DevHlp_PciRawRegister,
    50405045    pdmR3DevHlp_DMACRegister,
  • trunk/src/VBox/VMM/VMMR3/PDMDevMiscHlp.cpp

    r81938 r81961  
    317317
    318318
    319 /** @interface_method_impl{PDMHPETHLPR3,pfnGetRCHelpers} */
    320 static DECLCALLBACK(PCPDMHPETHLPRC) pdmR3HpetHlp_GetRCHelpers(PPDMDEVINS pDevIns)
    321 {
    322     PDMDEV_ASSERT_DEVINS(pDevIns);
    323     PVM pVM = pDevIns->Internal.s.pVMR3;
    324     VM_ASSERT_EMT(pVM);
    325 
    326     RTRCPTR pRCHelpers = NIL_RTRCPTR;
    327     if (VM_IS_RAW_MODE_ENABLED(pVM))
    328     {
    329         int rc = PDMR3LdrGetSymbolRC(pVM, NULL, "g_pdmRCHpetHlp", &pRCHelpers);
    330         AssertReleaseRC(rc);
    331         AssertRelease(pRCHelpers);
    332     }
    333 
    334     LogFlow(("pdmR3HpetHlp_GetGCHelpers: caller='%s'/%d: returns %RRv\n",
    335              pDevIns->pReg->szName, pDevIns->iInstance, pRCHelpers));
    336     return pRCHelpers;
    337 }
    338 
    339 
    340 /** @interface_method_impl{PDMHPETHLPR3,pfnGetR0Helpers} */
    341 static DECLCALLBACK(PCPDMHPETHLPR0) pdmR3HpetHlp_GetR0Helpers(PPDMDEVINS pDevIns)
    342 {
    343     PDMDEV_ASSERT_DEVINS(pDevIns);
    344     PVM pVM = pDevIns->Internal.s.pVMR3;
    345     VM_ASSERT_EMT(pVM);
    346     PCPDMHPETHLPR0 pR0Helpers = 0;
    347     int rc = PDMR3LdrGetSymbolR0(pVM, NULL, "g_pdmR0HpetHlp", &pR0Helpers);
    348     AssertReleaseRC(rc);
    349     AssertRelease(pR0Helpers);
    350     LogFlow(("pdmR3HpetHlp_GetR0Helpers: caller='%s'/%d: returns %RHv\n",
    351              pDevIns->pReg->szName, pDevIns->iInstance, pR0Helpers));
    352     return pR0Helpers;
    353 }
    354 
    355 
    356319/**
    357320 * HPET Device Helpers.
     
    360323{
    361324    PDM_HPETHLPR3_VERSION,
    362     pdmR3HpetHlp_GetRCHelpers,
    363     pdmR3HpetHlp_GetR0Helpers,
    364325    pdmR3HpetHlp_SetLegacyMode,
    365326    pdmR3HpetHlp_SetIrq,
  • trunk/src/VBox/VMM/include/PDMInternal.h

    r81948 r81961  
    12311231    /** The registered I/O APIC device. */
    12321232    PDMIOAPIC                       IoApic;
     1233    /** The registered HPET device. */
     1234    PPDMDEVINSR3                    pHpet;
    12331235
    12341236    /** List of registered devices. (FIFO) */
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