VirtualBox

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


Ignore:
Timestamp:
Oct 29, 2019 10:38:26 AM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
134304
Message:

VMM/PDMDevHlp: Adding helpers for getting the mapping addresses of I/O port and MMIO regions, mainly for info handlers and logging (thus only ring-3). bugref:9218

Location:
trunk/src/VBox/VMM/VMMR3
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR3/IOMR3IoPort.cpp

    r81461 r81564  
    548548
    549549/**
     550 * Gets the mapping address of I/O ports @a hIoPorts.
     551 *
     552 * @returns Mapping address if mapped, UINT32_MAX if not mapped or invalid
     553 *          input.
     554 * @param   pVM         The cross context VM structure.
     555 * @param   pDevIns     The device which allegedly owns @a hRegion.
     556 * @param   hIoPorts    The handle to I/O port region.
     557 */
     558VMMR3_INT_DECL(uint32_t) IOMR3IoPortGetMappingAddress(PVM pVM, PPDMDEVINS pDevIns, IOMIOPORTHANDLE hIoPorts)
     559{
     560    AssertPtrReturn(pDevIns, UINT32_MAX);
     561    AssertReturn(hIoPorts < RT_MIN(pVM->iom.s.cMmioRegs, pVM->iom.s.cMmioAlloc), UINT32_MAX);
     562    IOMIOPORTENTRYR3 volatile * const pRegEntry = &pVM->iom.s.paIoPortRegs[hIoPorts];
     563    AssertReturn(pRegEntry->pDevIns == pDevIns, UINT32_MAX);
     564    for (uint32_t iTry = 0; ; iTry++)
     565    {
     566        bool        fMapped = pRegEntry->fMapped;
     567        RTIOPORT    uPort   = pRegEntry->uPort;
     568        if (   (   ASMAtomicReadBool(&pRegEntry->fMapped) == fMapped
     569                && uPort == pRegEntry->uPort)
     570            || iTry > 1024)
     571            return fMapped ? uPort : UINT32_MAX;
     572        ASMNopPause();
     573    }
     574}
     575
     576
     577/**
    550578 * Display a single I/O port ring-3 range.
    551579 *
  • trunk/src/VBox/VMM/VMMR3/IOMR3Mmio.cpp

    r81461 r81564  
    488488
    489489/**
     490 * Gets the mapping address of MMIO region @a hRegion.
     491 *
     492 * @returns Mapping address if mapped, NIL_RTGCPHYS if not mapped or invalid
     493 *          input.
     494 * @param   pVM         The cross context VM structure.
     495 * @param   pDevIns     The device which allegedly owns @a hRegion.
     496 * @param   hRegion     The handle to validate.
     497 */
     498VMMR3_INT_DECL(RTGCPHYS) IOMR3MmioGetMappingAddress(PVM pVM, PPDMDEVINS pDevIns, IOMMMIOHANDLE hRegion)
     499{
     500    AssertPtrReturn(pDevIns, NIL_RTGCPHYS);
     501    AssertReturn(hRegion < RT_MIN(pVM->iom.s.cMmioRegs, pVM->iom.s.cMmioAlloc), NIL_RTGCPHYS);
     502    PIOMMMIOENTRYR3 const pRegEntry = &pVM->iom.s.paMmioRegs[hRegion];
     503    AssertReturn(pRegEntry->pDevIns == pDevIns, NIL_RTGCPHYS);
     504    return pRegEntry->GCPhysMapping;
     505}
     506
     507
     508/**
    490509 * Display a single MMIO range.
    491510 *
  • trunk/src/VBox/VMM/VMMR3/PDMDevHlp.cpp

    r81555 r81564  
    145145    return rc;
    146146}
     147
     148
     149/** @interface_method_impl{PDMDEVHLPR3,pfnIoPortGetMappingAddress} */
     150static DECLCALLBACK(uint32_t) pdmR3DevHlp_IoPortGetMappingAddress(PPDMDEVINS pDevIns, IOMIOPORTHANDLE hIoPorts)
     151{
     152    PDMDEV_ASSERT_DEVINS(pDevIns);
     153    LogFlow(("pdmR3DevHlp_IoPortGetMappingAddress: caller='%s'/%d: hIoPorts=%#x\n", pDevIns->pReg->szName, pDevIns->iInstance, hIoPorts));
     154
     155    uint32_t uAddress = IOMR3IoPortGetMappingAddress(pDevIns->Internal.s.pVMR3, pDevIns, hIoPorts);
     156
     157    LogFlow(("pdmR3DevHlp_IoPortGetMappingAddress: caller='%s'/%d: returns %#RX32\n", pDevIns->pReg->szName, pDevIns->iInstance, uAddress));
     158    return uAddress;
     159}
     160
    147161
    148162/** @interface_method_impl{PDMDEVHLPR3,pfnIOPortRegister} */
     
    395409    LogFlow(("pdmR3DevHlp_MmioReduce: caller='%s'/%d: returns %Rrc\n", pDevIns->pReg->szName, pDevIns->iInstance, rc));
    396410    return rc;
     411}
     412
     413
     414/** @interface_method_impl{PDMDEVHLPR3,pfnMmioGetMappingAddress} */
     415static DECLCALLBACK(RTGCPHYS) pdmR3DevHlp_MmioGetMappingAddress(PPDMDEVINS pDevIns, IOMMMIOHANDLE hRegion)
     416{
     417    PDMDEV_ASSERT_DEVINS(pDevIns);
     418    LogFlow(("pdmR3DevHlp_MmioGetMappingAddress: caller='%s'/%d: hRegion=%#x\n", pDevIns->pReg->szName, pDevIns->iInstance, hRegion));
     419
     420    RTGCPHYS GCPhys = IOMR3MmioGetMappingAddress(pDevIns->Internal.s.pVMR3, pDevIns, hRegion);
     421
     422    LogFlow(("pdmR3DevHlp_MmioGetMappingAddress: caller='%s'/%d: returns %RGp\n", pDevIns->pReg->szName, pDevIns->iInstance, GCPhys));
     423    return GCPhys;
    397424}
    398425
     
    44544481    pdmR3DevHlp_IoPortMap,
    44554482    pdmR3DevHlp_IoPortUnmap,
     4483    pdmR3DevHlp_IoPortGetMappingAddress,
    44564484    pdmR3DevHlp_IOPortRegister,
    44574485    pdmR3DevHlp_IOPortRegisterRC,
     
    44624490    pdmR3DevHlp_MmioUnmap,
    44634491    pdmR3DevHlp_MmioReduce,
     4492    pdmR3DevHlp_MmioGetMappingAddress,
    44644493    pdmR3DevHlp_MMIORegister,
    44654494    pdmR3DevHlp_MMIORegisterRC,
     
    49224951    pdmR3DevHlp_IoPortMap,
    49234952    pdmR3DevHlp_IoPortUnmap,
     4953    pdmR3DevHlp_IoPortGetMappingAddress,
    49244954    pdmR3DevHlp_IOPortRegister,
    49254955    pdmR3DevHlp_IOPortRegisterRC,
     
    49304960    pdmR3DevHlp_MmioUnmap,
    49314961    pdmR3DevHlp_MmioReduce,
     4962    pdmR3DevHlp_MmioGetMappingAddress,
    49324963    pdmR3DevHlp_MMIORegister,
    49334964    pdmR3DevHlp_MMIORegisterRC,
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