VirtualBox

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


Ignore:
Timestamp:
Oct 9, 2019 8:36:46 PM (5 years ago)
Author:
vboxsync
Message:

IOM: More MMIO code. bugref:9218

Location:
trunk/src/VBox/VMM
Files:
7 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/Makefile.kmk

    r81167 r81197  
    484484        VMMR0/IOMR0.cpp \
    485485        VMMR0/IOMR0IoPort.cpp \
     486        VMMR0/IOMR0Mmio.cpp \
    486487        VMMR0/PDMR0Device.cpp \
    487488        VMMR0/PDMR0Driver.cpp \
  • trunk/src/VBox/VMM/VMMR0/IOMR0.cpp

    r81169 r81197  
    4343
    4444    iomR0IoPortInitPerVMData(pGVM);
     45    iomR0MmioInitPerVMData(pGVM);
    4546}
    4647
     
    5253{
    5354    iomR0IoPortCleanupVM(pGVM);
     55    iomR0MmioCleanupVM(pGVM);
    5456}
    5557
  • trunk/src/VBox/VMM/VMMR0/IOMR0IoPort.cpp

    r81167 r81197  
    9898    AssertReturn(pGVM->iomr0.s.paIoPortRing3Regs[hIoPorts].pDevIns == pDevIns->pDevInsForR3, VERR_IOM_INVALID_IOPORT_HANDLE);
    9999    AssertReturn(pGVM->iomr0.s.paIoPortRegs[hIoPorts].pDevIns == NULL, VERR_WRONG_ORDER);
     100    Assert(pGVM->iomr0.s.paIoPortRegs[hIoPorts].idxSelf == hIoPorts);
    100101
    101102    AssertReturn(pfnOut || pfnIn || pfnOutStr || pfnInStr, VERR_INVALID_PARAMETER);
  • trunk/src/VBox/VMM/VMMR0/IOMR0Mmio.cpp

    r81167 r81197  
    11/* $Id$ */
    22/** @file
    3  * IOM - Host Context Ring 0, I/O ports.
     3 * IOM - Host Context Ring 0, MMIO.
    44 */
    55
     
    3636
    3737/**
    38  * Initializes the I/O port related members.
     38 * Initializes the MMIO related members.
    3939 *
    4040 * @param   pGVM    Pointer to the global VM structure.
    4141 */
    42 void iomR0IoPortInitPerVMData(PGVM pGVM)
    43 {
    44     pGVM->iomr0.s.hIoPortMapObj      = NIL_RTR0MEMOBJ;
    45     pGVM->iomr0.s.hIoPortMemObj      = NIL_RTR0MEMOBJ;
     42void iomR0MmioInitPerVMData(PGVM pGVM)
     43{
     44    pGVM->iomr0.s.hMmioMapObj      = NIL_RTR0MEMOBJ;
     45    pGVM->iomr0.s.hMmioMemObj      = NIL_RTR0MEMOBJ;
    4646#ifdef VBOX_WITH_STATISTICS
    47     pGVM->iomr0.s.hIoPortStatsMapObj = NIL_RTR0MEMOBJ;
    48     pGVM->iomr0.s.hIoPortStatsMemObj = NIL_RTR0MEMOBJ;
     47    pGVM->iomr0.s.hMmioStatsMapObj = NIL_RTR0MEMOBJ;
     48    pGVM->iomr0.s.hMmioStatsMemObj = NIL_RTR0MEMOBJ;
    4949#endif
    5050}
     
    5252
    5353/**
    54  * Cleans up I/O port related resources.
    55  */
    56 void iomR0IoPortCleanupVM(PGVM pGVM)
    57 {
    58     RTR0MemObjFree(pGVM->iomr0.s.hIoPortMapObj, true /*fFreeMappings*/);
    59     pGVM->iomr0.s.hIoPortMapObj      = NIL_RTR0MEMOBJ;
    60     RTR0MemObjFree(pGVM->iomr0.s.hIoPortMemObj, true /*fFreeMappings*/);
    61     pGVM->iomr0.s.hIoPortMemObj      = NIL_RTR0MEMOBJ;
     54 * Cleans up MMIO related resources.
     55 */
     56void iomR0MmioCleanupVM(PGVM pGVM)
     57{
     58    RTR0MemObjFree(pGVM->iomr0.s.hMmioMapObj, true /*fFreeMappings*/);
     59    pGVM->iomr0.s.hMmioMapObj      = NIL_RTR0MEMOBJ;
     60    RTR0MemObjFree(pGVM->iomr0.s.hMmioMemObj, true /*fFreeMappings*/);
     61    pGVM->iomr0.s.hMmioMemObj      = NIL_RTR0MEMOBJ;
    6262#ifdef VBOX_WITH_STATISTICS
    63     RTR0MemObjFree(pGVM->iomr0.s.hIoPortStatsMapObj, true /*fFreeMappings*/);
    64     pGVM->iomr0.s.hIoPortStatsMapObj = NIL_RTR0MEMOBJ;
    65     RTR0MemObjFree(pGVM->iomr0.s.hIoPortStatsMemObj, true /*fFreeMappings*/);
    66     pGVM->iomr0.s.hIoPortStatsMemObj = NIL_RTR0MEMOBJ;
     63    RTR0MemObjFree(pGVM->iomr0.s.hMmioStatsMapObj, true /*fFreeMappings*/);
     64    pGVM->iomr0.s.hMmioStatsMapObj = NIL_RTR0MEMOBJ;
     65    RTR0MemObjFree(pGVM->iomr0.s.hMmioStatsMemObj, true /*fFreeMappings*/);
     66    pGVM->iomr0.s.hMmioStatsMemObj = NIL_RTR0MEMOBJ;
    6767#endif
    6868}
     
    7070
    7171/**
    72  * Implements PDMDEVHLPR0::pfnIoPortSetUpContext.
     72 * Implements PDMDEVHLPR0::pfnMmioSetUpContext.
    7373 *
    7474 * @param   pGVM            The global (ring-0) VM structure.
    7575 * @param   pDevIns         The device instance.
    76  * @param   hIoPorts        The I/O port handle (already registered in ring-3).
    77  * @param   pfnOut          The OUT handler callback, optional.
    78  * @param   pfnIn           The IN handler callback, optional.
    79  * @param   pfnOutStr       The REP OUTS handler callback, optional.
    80  * @param   pfnInStr        The REP INS handler callback, optional.
     76 * @param   hRegion         The MMIO region handle (already registered in
     77 *                          ring-3).
     78 * @param   pfnWrite        The write handler callback, optional.
     79 * @param   pfnRead         The read handler callback, optional.
     80 * @param   pfnFill         The fill handler callback, optional.
    8181 * @param   pvUser          User argument for the callbacks.
    8282 * @thread  EMT(0)
    8383 * @note    Only callable at VM creation time.
    8484 */
    85 VMMR0_INT_DECL(int)  IOMR0IoPortSetUpContext(PGVM pGVM, PPDMDEVINS pDevIns, IOMIOPORTHANDLE hIoPorts,
    86                                              PFNIOMIOPORTNEWOUT pfnOut,  PFNIOMIOPORTNEWIN pfnIn,
    87                                              PFNIOMIOPORTNEWOUTSTRING pfnOutStr, PFNIOMIOPORTNEWINSTRING pfnInStr, void *pvUser)
     85VMMR0_INT_DECL(int)  IOMR0MmioSetUpContext(PGVM pGVM, PPDMDEVINS pDevIns, IOMMMIOHANDLE hRegion, PFNIOMMMIONEWWRITE pfnWrite,
     86                                           PFNIOMMMIONEWREAD pfnRead, PFNIOMMMIONEWFILL pfnFill, void *pvUser)
    8887{
    8988    /*
     
    9291    VM_ASSERT_EMT0_RETURN(pGVM, VERR_VM_THREAD_NOT_EMT);
    9392    VM_ASSERT_STATE_RETURN(pGVM, VMSTATE_CREATING, VERR_VM_INVALID_VM_STATE);
    94     AssertReturn(hIoPorts < pGVM->iomr0.s.cIoPortAlloc, VERR_IOM_INVALID_IOPORT_HANDLE);
    95     AssertReturn(hIoPorts < pGVM->iom.s.cIoPortRegs, VERR_IOM_INVALID_IOPORT_HANDLE);
     93    AssertReturn(hRegion < pGVM->iomr0.s.cMmioAlloc, VERR_IOM_INVALID_MMIO_HANDLE);
     94    AssertReturn(hRegion < pGVM->iom.s.cMmioRegs, VERR_IOM_INVALID_MMIO_HANDLE);
    9695    AssertPtrReturn(pDevIns, VERR_INVALID_HANDLE);
    9796    AssertReturn(pDevIns->pDevInsForR3 != NIL_RTR3PTR && !(pDevIns->pDevInsForR3 & PAGE_OFFSET_MASK), VERR_INVALID_PARAMETER);
    98     AssertReturn(pGVM->iomr0.s.paIoPortRing3Regs[hIoPorts].pDevIns == pDevIns->pDevInsForR3, VERR_IOM_INVALID_IOPORT_HANDLE);
    99     AssertReturn(pGVM->iomr0.s.paIoPortRegs[hIoPorts].pDevIns == NULL, VERR_WRONG_ORDER);
    100 
    101     AssertReturn(pfnOut || pfnIn || pfnOutStr || pfnInStr, VERR_INVALID_PARAMETER);
    102     AssertPtrNullReturn(pfnOut, VERR_INVALID_POINTER);
    103     AssertPtrNullReturn(pfnIn, VERR_INVALID_POINTER);
    104     AssertPtrNullReturn(pfnOutStr, VERR_INVALID_POINTER);
    105     AssertPtrNullReturn(pfnInStr, VERR_INVALID_POINTER);
    106 
    107     uint16_t const fFlags = pGVM->iomr0.s.paIoPortRing3Regs[hIoPorts].fFlags;
    108     RTIOPORT const cPorts = pGVM->iomr0.s.paIoPortRing3Regs[hIoPorts].cPorts;
    109     AssertMsgReturn(cPorts > 0 && cPorts <= _8K, ("cPorts=%s\n", cPorts), VERR_IOM_INVALID_IOPORT_HANDLE);
     97    AssertReturn(pGVM->iomr0.s.paMmioRing3Regs[hRegion].pDevIns == pDevIns->pDevInsForR3, VERR_IOM_INVALID_MMIO_HANDLE);
     98    AssertReturn(pGVM->iomr0.s.paMmioRegs[hRegion].pDevIns == NULL, VERR_WRONG_ORDER);
     99    Assert(pGVM->iomr0.s.paMmioRegs[hRegion].idxSelf == hRegion);
     100
     101    AssertReturn(pfnWrite || pfnRead || pfnFill, VERR_INVALID_PARAMETER);
     102    AssertPtrNullReturn(pfnWrite, VERR_INVALID_POINTER);
     103    AssertPtrNullReturn(pfnRead, VERR_INVALID_POINTER);
     104    AssertPtrNullReturn(pfnFill, VERR_INVALID_POINTER);
     105
     106    uint32_t const fFlags   = pGVM->iomr0.s.paMmioRing3Regs[hRegion].fFlags;
     107    RTGCPHYS const cbRegion = pGVM->iomr0.s.paMmioRing3Regs[hRegion].cbRegion;
     108    AssertMsgReturn(cbRegion > 0 && cbRegion <= _1T, ("cbRegion=%#RGp\n", cbRegion), VERR_IOM_INVALID_MMIO_HANDLE);
    110109
    111110    /*
    112111     * Do the job.
    113112     */
    114     pGVM->iomr0.s.paIoPortRegs[hIoPorts].pvUser             = pvUser;
    115     pGVM->iomr0.s.paIoPortRegs[hIoPorts].pDevIns            = pDevIns;
    116     pGVM->iomr0.s.paIoPortRegs[hIoPorts].pfnOutCallback     = pfnOut;
    117     pGVM->iomr0.s.paIoPortRegs[hIoPorts].pfnInCallback      = pfnIn;
    118     pGVM->iomr0.s.paIoPortRegs[hIoPorts].pfnOutStrCallback  = pfnOutStr;
    119     pGVM->iomr0.s.paIoPortRegs[hIoPorts].pfnInStrCallback   = pfnInStr;
    120     pGVM->iomr0.s.paIoPortRegs[hIoPorts].cPorts             = cPorts;
    121     pGVM->iomr0.s.paIoPortRegs[hIoPorts].fFlags             = fFlags;
     113    pGVM->iomr0.s.paMmioRegs[hRegion].cbRegion          = cbRegion;
     114    pGVM->iomr0.s.paMmioRegs[hRegion].pvUser            = pvUser;
     115    pGVM->iomr0.s.paMmioRegs[hRegion].pDevIns           = pDevIns;
     116    pGVM->iomr0.s.paMmioRegs[hRegion].pfnWriteCallback  = pfnWrite;
     117    pGVM->iomr0.s.paMmioRegs[hRegion].pfnReadCallback   = pfnRead;
     118    pGVM->iomr0.s.paMmioRegs[hRegion].pfnFillCallback   = pfnFill;
     119    pGVM->iomr0.s.paMmioRegs[hRegion].fFlags            = fFlags;
    122120#ifdef VBOX_WITH_STATISTICS
    123     uint16_t const idxStats = pGVM->iomr0.s.paIoPortRing3Regs[hIoPorts].idxStats;
    124     pGVM->iomr0.s.paIoPortRegs[hIoPorts].idxStats           = (uint32_t)idxStats + cPorts <= pGVM->iomr0.s.cIoPortStatsAllocation
    125                                                             ? idxStats : UINT16_MAX;
     121    uint16_t const idxStats = pGVM->iomr0.s.paMmioRing3Regs[hRegion].idxStats;
     122    pGVM->iomr0.s.paMmioRegs[hRegion].idxStats          = (uint32_t)idxStats < pGVM->iomr0.s.cMmioStatsAllocation
     123                                                        ? idxStats : UINT16_MAX;
    126124#else
    127     pGVM->iomr0.s.paIoPortRegs[hIoPorts].idxStats           = UINT16_MAX;
     125    pGVM->iomr0.s.paMmioRegs[hRegion].idxStats          = UINT16_MAX;
    128126#endif
    129127
    130     pGVM->iomr0.s.paIoPortRing3Regs[hIoPorts].fRing0 = true;
     128    pGVM->iomr0.s.paMmioRing3Regs[hRegion].fRing0 = true;
    131129
    132130    return VINF_SUCCESS;
     
    135133
    136134/**
    137  * Grows the I/O port registration (all contexts) and lookup tables.
     135 * Grows the MMIO registration (all contexts) and lookup tables.
    138136 *
    139137 * @returns VBox status code.
     
    143141 * @note    Only callable at VM creation time.
    144142 */
    145 VMMR0_INT_DECL(int) IOMR0IoPortGrowRegistrationTables(PGVM pGVM, uint64_t cReqMinEntries)
     143VMMR0_INT_DECL(int) IOMR0MmioGrowRegistrationTables(PGVM pGVM, uint64_t cReqMinEntries)
    146144{
    147145    /*
     
    150148    VM_ASSERT_EMT0_RETURN(pGVM, VERR_VM_THREAD_NOT_EMT);
    151149    VM_ASSERT_STATE_RETURN(pGVM, VMSTATE_CREATING, VERR_VM_INVALID_VM_STATE);
    152     AssertReturn(cReqMinEntries <= _4K, VERR_IOM_TOO_MANY_IOPORT_REGISTRATIONS);
     150    AssertReturn(cReqMinEntries <= _4K, VERR_IOM_TOO_MANY_MMIO_REGISTRATIONS);
    153151    uint32_t cNewEntries = (uint32_t)cReqMinEntries;
    154     AssertReturn(cNewEntries >= pGVM->iom.s.cIoPortAlloc, VERR_IOM_IOPORT_IPE_1);
    155     uint32_t const cOldEntries = pGVM->iomr0.s.cIoPortAlloc;
     152    AssertReturn(cNewEntries >= pGVM->iom.s.cMmioAlloc, VERR_IOM_MMIO_IPE_1);
     153    uint32_t const cOldEntries = pGVM->iomr0.s.cMmioAlloc;
    156154    ASMCompilerBarrier();
    157     AssertReturn(cNewEntries >= cOldEntries, VERR_IOM_IOPORT_IPE_2);
    158     AssertReturn(pGVM->iom.s.cIoPortRegs >= pGVM->iomr0.s.cIoPortMax, VERR_IOM_IOPORT_IPE_3);
     155    AssertReturn(cNewEntries >= cOldEntries, VERR_IOM_MMIO_IPE_2);
     156    AssertReturn(pGVM->iom.s.cMmioRegs >= pGVM->iomr0.s.cMmioMax, VERR_IOM_MMIO_IPE_3);
    159157
    160158    /*
     
    162160     * ring-3, lookup) and does a partial mapping of the result to ring-3.
    163161     */
    164     uint32_t const cbRing0  = RT_ALIGN_32(cNewEntries * sizeof(IOMIOPORTENTRYR0),     PAGE_SIZE);
    165     uint32_t const cbRing3  = RT_ALIGN_32(cNewEntries * sizeof(IOMIOPORTENTRYR3),     PAGE_SIZE);
    166     uint32_t const cbShared = RT_ALIGN_32(cNewEntries * sizeof(IOMIOPORTLOOKUPENTRY), PAGE_SIZE);
     162    uint32_t const cbRing0  = RT_ALIGN_32(cNewEntries * sizeof(IOMMMIOENTRYR0),     PAGE_SIZE);
     163    uint32_t const cbRing3  = RT_ALIGN_32(cNewEntries * sizeof(IOMMMIOENTRYR3),     PAGE_SIZE);
     164    uint32_t const cbShared = RT_ALIGN_32(cNewEntries * sizeof(IOMMMIOLOOKUPENTRY), PAGE_SIZE);
    167165    uint32_t const cbNew    = cbRing0 + cbRing3 + cbShared;
    168166
    169167    /* Use the rounded up space as best we can. */
    170     cNewEntries = RT_MIN(RT_MIN(cbRing0 / sizeof(IOMIOPORTENTRYR0), cbRing3 / sizeof(IOMIOPORTENTRYR3)),
    171                          cbShared / sizeof(IOMIOPORTLOOKUPENTRY));
     168    cNewEntries = RT_MIN(RT_MIN(cbRing0 / sizeof(IOMMMIOENTRYR0), cbRing3 / sizeof(IOMMMIOENTRYR3)),
     169                         cbShared / sizeof(IOMMMIOLOOKUPENTRY));
    172170
    173171    RTR0MEMOBJ hMemObj;
     
    185183        if (RT_SUCCESS(rc))
    186184        {
    187             PIOMIOPORTENTRYR0     const paRing0    = (PIOMIOPORTENTRYR0)RTR0MemObjAddress(hMemObj);
    188             PIOMIOPORTENTRYR3     const paRing3    = (PIOMIOPORTENTRYR3)((uintptr_t)paRing0 + cbRing0);
    189             PIOMIOPORTLOOKUPENTRY const paLookup   = (PIOMIOPORTLOOKUPENTRY)((uintptr_t)paRing3 + cbRing3);
     185            PIOMMMIOENTRYR0       const paRing0    = (PIOMMMIOENTRYR0)RTR0MemObjAddress(hMemObj);
     186            PIOMMMIOENTRYR3       const paRing3    = (PIOMMMIOENTRYR3)((uintptr_t)paRing0 + cbRing0);
     187            PIOMMMIOLOOKUPENTRY   const paLookup   = (PIOMMMIOLOOKUPENTRY)((uintptr_t)paRing3 + cbRing3);
    190188            RTR3UINTPTR           const uAddrRing3 = RTR0MemObjAddressR3(hMapObj);
    191189
     
    193191             * Copy over the old info and initialize the idxSelf and idxStats members.
    194192             */
    195             if (pGVM->iomr0.s.paIoPortRegs != NULL)
     193            if (pGVM->iomr0.s.paMmioRegs != NULL)
    196194            {
    197                 memcpy(paRing0,  pGVM->iomr0.s.paIoPortRegs,      sizeof(paRing0[0])  * cOldEntries);
    198                 memcpy(paRing3,  pGVM->iomr0.s.paIoPortRing3Regs, sizeof(paRing3[0])  * cOldEntries);
    199                 memcpy(paLookup, pGVM->iomr0.s.paIoPortLookup,    sizeof(paLookup[0]) * cOldEntries);
     195                memcpy(paRing0,  pGVM->iomr0.s.paMmioRegs,      sizeof(paRing0[0])  * cOldEntries);
     196                memcpy(paRing3,  pGVM->iomr0.s.paMmioRing3Regs, sizeof(paRing3[0])  * cOldEntries);
     197                memcpy(paLookup, pGVM->iomr0.s.paMmioLookup,    sizeof(paLookup[0]) * cOldEntries);
    200198            }
    201199
     
    212210             * Switch the memory handles.
    213211             */
    214             RTR0MEMOBJ hTmp = pGVM->iomr0.s.hIoPortMapObj;
    215             pGVM->iomr0.s.hIoPortMapObj = hMapObj;
     212            RTR0MEMOBJ hTmp = pGVM->iomr0.s.hMmioMapObj;
     213            pGVM->iomr0.s.hMmioMapObj = hMapObj;
    216214            hMapObj = hTmp;
    217215
    218             hTmp = pGVM->iomr0.s.hIoPortMemObj;
    219             pGVM->iomr0.s.hIoPortMemObj = hMemObj;
     216            hTmp = pGVM->iomr0.s.hMmioMemObj;
     217            pGVM->iomr0.s.hMmioMemObj = hMemObj;
    220218            hMemObj = hTmp;
    221219
     
    223221             * Update the variables.
    224222             */
    225             pGVM->iomr0.s.paIoPortRegs      = paRing0;
    226             pGVM->iomr0.s.paIoPortRing3Regs = paRing3;
    227             pGVM->iomr0.s.paIoPortLookup    = paLookup;
    228             pGVM->iom.s.paIoPortRegs        = uAddrRing3;
    229             pGVM->iom.s.paIoPortLookup      = uAddrRing3 + cbRing3;
    230             pGVM->iom.s.cIoPortAlloc        = cNewEntries;
    231             pGVM->iomr0.s.cIoPortAlloc      = cNewEntries;
     223            pGVM->iomr0.s.paMmioRegs      = paRing0;
     224            pGVM->iomr0.s.paMmioRing3Regs = paRing3;
     225            pGVM->iomr0.s.paMmioLookup    = paLookup;
     226            pGVM->iom.s.paMmioRegs        = uAddrRing3;
     227            pGVM->iom.s.paMmioLookup      = uAddrRing3 + cbRing3;
     228            pGVM->iom.s.cMmioAlloc        = cNewEntries;
     229            pGVM->iomr0.s.cMmioAlloc      = cNewEntries;
    232230
    233231            /*
     
    244242
    245243/**
    246  * Grows the I/O port statistics table.
     244 * Grows the MMIO statistics table.
    247245 *
    248246 * @returns VBox status code.
     
    252250 * @note    Only callable at VM creation time.
    253251 */
    254 VMMR0_INT_DECL(int) IOMR0IoPortGrowStatisticsTable(PGVM pGVM, uint64_t cReqMinEntries)
     252VMMR0_INT_DECL(int) IOMR0MmioGrowStatisticsTable(PGVM pGVM, uint64_t cReqMinEntries)
    255253{
    256254    /*
     
    259257    VM_ASSERT_EMT0_RETURN(pGVM, VERR_VM_THREAD_NOT_EMT);
    260258    VM_ASSERT_STATE_RETURN(pGVM, VMSTATE_CREATING, VERR_VM_INVALID_VM_STATE);
    261     AssertReturn(cReqMinEntries <= _64K, VERR_IOM_TOO_MANY_IOPORT_REGISTRATIONS);
     259    AssertReturn(cReqMinEntries <= _64K, VERR_IOM_TOO_MANY_MMIO_REGISTRATIONS);
    262260    uint32_t cNewEntries = (uint32_t)cReqMinEntries;
    263261#ifdef VBOX_WITH_STATISTICS
    264     uint32_t const cOldEntries = pGVM->iomr0.s.cIoPortStatsAllocation;
     262    uint32_t const cOldEntries = pGVM->iomr0.s.cMmioStatsAllocation;
    265263    ASMCompilerBarrier();
    266264#else
    267265    uint32_t const cOldEntries = 0;
    268266#endif
    269     AssertReturn(cNewEntries > cOldEntries, VERR_IOM_IOPORT_IPE_1);
    270     AssertReturn(pGVM->iom.s.cIoPortStatsAllocation == cOldEntries, VERR_IOM_IOPORT_IPE_1);
    271     AssertReturn(pGVM->iom.s.cIoPortStats <= cOldEntries, VERR_IOM_IOPORT_IPE_2);
     267    AssertReturn(cNewEntries > cOldEntries, VERR_IOM_MMIO_IPE_1);
     268    AssertReturn(pGVM->iom.s.cMmioStatsAllocation == cOldEntries, VERR_IOM_MMIO_IPE_1);
     269    AssertReturn(pGVM->iom.s.cMmioStats <= cOldEntries, VERR_IOM_MMIO_IPE_2);
    272270
    273271    /*
     
    277275    AssertFailedReturn(VERR_NOT_SUPPORTED);
    278276#else
    279     uint32_t const cbNew = RT_ALIGN_32(cNewEntries * sizeof(IOMIOPORTSTATSENTRY), PAGE_SIZE);
    280     cNewEntries = cbNew / sizeof(IOMIOPORTSTATSENTRY);
     277    uint32_t const cbNew = RT_ALIGN_32(cNewEntries * sizeof(IOMMMIOSTATSENTRY), PAGE_SIZE);
     278    cNewEntries = cbNew / sizeof(IOMMMIOSTATSENTRY);
    281279
    282280    RTR0MEMOBJ hMemObj;
     
    290288        if (RT_SUCCESS(rc))
    291289        {
    292             PIOMIOPORTSTATSENTRY pIoPortStats = (PIOMIOPORTSTATSENTRY)RTR0MemObjAddress(hMemObj);
     290            PIOMMMIOSTATSENTRY pMmioStats = (PIOMMMIOSTATSENTRY)RTR0MemObjAddress(hMemObj);
    293291
    294292            /*
    295293             * Anything to copy over and free up?
    296294             */
    297             if (pGVM->iomr0.s.paIoPortStats)
    298                 memcpy(pIoPortStats, pGVM->iomr0.s.paIoPortStats, cOldEntries * sizeof(IOMIOPORTSTATSENTRY));
     295            if (pGVM->iomr0.s.paMmioStats)
     296                memcpy(pMmioStats, pGVM->iomr0.s.paMmioStats, cOldEntries * sizeof(IOMMMIOSTATSENTRY));
    299297
    300298            /*
    301299             * Switch the memory handles.
    302300             */
    303             RTR0MEMOBJ hTmp = pGVM->iomr0.s.hIoPortStatsMapObj;
    304             pGVM->iomr0.s.hIoPortStatsMapObj = hMapObj;
     301            RTR0MEMOBJ hTmp = pGVM->iomr0.s.hMmioStatsMapObj;
     302            pGVM->iomr0.s.hMmioStatsMapObj = hMapObj;
    305303            hMapObj = hTmp;
    306304
    307             hTmp = pGVM->iomr0.s.hIoPortStatsMemObj;
    308             pGVM->iomr0.s.hIoPortStatsMemObj = hMemObj;
     305            hTmp = pGVM->iomr0.s.hMmioStatsMemObj;
     306            pGVM->iomr0.s.hMmioStatsMemObj = hMemObj;
    309307            hMemObj = hTmp;
    310308
     
    312310             * Update the variables.
    313311             */
    314             pGVM->iomr0.s.paIoPortStats          = pIoPortStats;
    315             pGVM->iom.s.paIoPortStats            = RTR0MemObjAddressR3(pGVM->iomr0.s.hIoPortStatsMapObj);
    316             pGVM->iom.s.cIoPortStatsAllocation   = cNewEntries;
    317             pGVM->iomr0.s.cIoPortStatsAllocation = cNewEntries;
     312            pGVM->iomr0.s.paMmioStats          = pMmioStats;
     313            pGVM->iom.s.paMmioStats            = RTR0MemObjAddressR3(pGVM->iomr0.s.hMmioStatsMapObj);
     314            pGVM->iom.s.cMmioStatsAllocation   = cNewEntries;
     315            pGVM->iomr0.s.cMmioStatsAllocation = cNewEntries;
    318316
    319317            /*
  • trunk/src/VBox/VMM/VMMR0/PDMR0Device.cpp

    r81160 r81197  
    214214                                                        PFNIOMMMIONEWREAD pfnRead, PFNIOMMMIONEWFILL pfnFill, void *pvUser)
    215215{
    216     RT_NOREF(pDevIns, hRegion, pfnWrite, pfnRead, pfnFill, pvUser);
    217     return VERR_NOT_IMPLEMENTED;
     216    PDMDEV_ASSERT_DEVINS(pDevIns);
     217    LogFlow(("pdmR0DevHlp_MmioSetUpContextEx: caller='%s'/%d: hRegion=%#x pfnWrite=%p pfnRead=%p pfnFill=%p pvUser=%p\n",
     218             pDevIns->pReg->szName, pDevIns->iInstance, hRegion, pfnWrite, pfnRead, pfnFill, pvUser));
     219    PGVM pGVM = pDevIns->Internal.s.pGVM;
     220    VM_ASSERT_EMT0_RETURN(pGVM, VERR_VM_THREAD_NOT_EMT);
     221    VM_ASSERT_STATE_RETURN(pGVM, VMSTATE_CREATING, VERR_VM_INVALID_VM_STATE);
     222
     223    int rc = IOMR0MmioSetUpContext(pGVM, pDevIns, hRegion, pfnWrite, pfnRead, pfnFill, pvUser);
     224
     225    LogFlow(("pdmR0DevHlp_MmioSetUpContextEx: caller='%s'/%d: returns %Rrc\n", pDevIns->pReg->szName, pDevIns->iInstance, rc));
     226    return rc;
    218227}
    219228
  • trunk/src/VBox/VMM/VMMR0/VMMR0.cpp

    r81167 r81197  
    22032203            if (pReqHdr || idCpu != 0)
    22042204                return VERR_INVALID_PARAMETER;
    2205             rc = VERR_NOT_SUPPORTED; //rc = IOMR0MmioGrowRegistrationTables(pGVM, u64Arg);
     2205            rc = IOMR0MmioGrowRegistrationTables(pGVM, u64Arg);
    22062206            VMM_CHECK_SMAP_CHECK2(pGVM, RT_NOTHING);
    22072207            break;
     
    22122212            if (pReqHdr || idCpu != 0)
    22132213                return VERR_INVALID_PARAMETER;
    2214             rc = VERR_NOT_SUPPORTED; //rc = IOMR0MmioGrowStatisticsTable(pGVM, u64Arg);
     2214            rc = IOMR0MmioGrowStatisticsTable(pGVM, u64Arg);
    22152215            VMM_CHECK_SMAP_CHECK2(pGVM, RT_NOTHING);
    22162216            break;
  • trunk/src/VBox/VMM/VMMR3/IOMR3Mmio.cpp

    r81167 r81197  
    186186
    187187    RTGCPHYS const cbRegion = pRegEntry->cbRegion;
    188     AssertMsgReturn(cbRegion > 0 && cbRegion <= _1P, ("cbRegion=%RGp\n", cbRegion), VERR_IOM_MMIO_IPE_1);
     188    AssertMsgReturn(cbRegion > 0 && cbRegion <= _1T, ("cbRegion=%RGp\n", cbRegion), VERR_IOM_MMIO_IPE_1);
    189189    AssertReturn(GCPhys + cbRegion <= GCPhys, VERR_OUT_OF_RANGE);
    190190    RTGCPHYS const GCPhysLast = GCPhys + cbRegion - 1;
  • trunk/src/VBox/VMM/include/IOMInternal.h

    r81167 r81197  
    808808    /** MMIO registration table for ring-0.
    809809     * There is a parallel table for ring-3, paMmioRing3Regs. */
    810     R0PTRTYPE(PIOMIOPORTENTRYR0)    paMmioRegs;
     810    R0PTRTYPE(PIOMMMIOENTRYR0)      paMmioRegs;
    811811    /** MMIO lookup table. */
    812     R0PTRTYPE(PIOMIOPORTLOOKUPENTRY) paMmioLookup;
     812    R0PTRTYPE(PIOMMMIOLOOKUPENTRY) paMmioLookup;
    813813    /** MMIO registration table for ring-3.
    814814     * Also mapped to ring-3 as IOM::paMmioRegs. */
    815     R0PTRTYPE(PIOMIOPORTENTRYR3)    paMmioRing3Regs;
     815    R0PTRTYPE(PIOMMMIOENTRYR3)      paMmioRing3Regs;
    816816    /** Handle to the allocation backing both the ring-0 and ring-3 registration
    817817     * tables as well as the lookup table. */
     
    823823    uint32_t                        cMmioStatsAllocation;
    824824    /** MMIO lookup table.   */
    825     R0PTRTYPE(PIOMIOPORTSTATSENTRY) paMmioStats;
     825    R0PTRTYPE(PIOMMMIOSTATSENTRY)  paMmioStats;
    826826    /** Handle to the allocation backing the MMIO statistics. */
    827827    RTR0MEMOBJ                      hMmioStatsMemObj;
     
    845845void                iomR0IoPortCleanupVM(PGVM pGVM);
    846846void                iomR0IoPortInitPerVMData(PGVM pGVM);
     847void                iomR0MmioCleanupVM(PGVM pGVM);
     848void                iomR0MmioInitPerVMData(PGVM pGVM);
    847849#endif
    848850
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