Changeset 81197 in vbox for trunk/src/VBox/VMM
- Timestamp:
- Oct 9, 2019 8:36:46 PM (5 years ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 7 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/Makefile.kmk
r81167 r81197 484 484 VMMR0/IOMR0.cpp \ 485 485 VMMR0/IOMR0IoPort.cpp \ 486 VMMR0/IOMR0Mmio.cpp \ 486 487 VMMR0/PDMR0Device.cpp \ 487 488 VMMR0/PDMR0Driver.cpp \ -
trunk/src/VBox/VMM/VMMR0/IOMR0.cpp
r81169 r81197 43 43 44 44 iomR0IoPortInitPerVMData(pGVM); 45 iomR0MmioInitPerVMData(pGVM); 45 46 } 46 47 … … 52 53 { 53 54 iomR0IoPortCleanupVM(pGVM); 55 iomR0MmioCleanupVM(pGVM); 54 56 } 55 57 -
trunk/src/VBox/VMM/VMMR0/IOMR0IoPort.cpp
r81167 r81197 98 98 AssertReturn(pGVM->iomr0.s.paIoPortRing3Regs[hIoPorts].pDevIns == pDevIns->pDevInsForR3, VERR_IOM_INVALID_IOPORT_HANDLE); 99 99 AssertReturn(pGVM->iomr0.s.paIoPortRegs[hIoPorts].pDevIns == NULL, VERR_WRONG_ORDER); 100 Assert(pGVM->iomr0.s.paIoPortRegs[hIoPorts].idxSelf == hIoPorts); 100 101 101 102 AssertReturn(pfnOut || pfnIn || pfnOutStr || pfnInStr, VERR_INVALID_PARAMETER); -
trunk/src/VBox/VMM/VMMR0/IOMR0Mmio.cpp
r81167 r81197 1 1 /* $Id$ */ 2 2 /** @file 3 * IOM - Host Context Ring 0, I/O ports.3 * IOM - Host Context Ring 0, MMIO. 4 4 */ 5 5 … … 36 36 37 37 /** 38 * Initializes the I/O portrelated members.38 * Initializes the MMIO related members. 39 39 * 40 40 * @param pGVM Pointer to the global VM structure. 41 41 */ 42 void iomR0 IoPortInitPerVMData(PGVM pGVM)43 { 44 pGVM->iomr0.s.h IoPortMapObj = NIL_RTR0MEMOBJ;45 pGVM->iomr0.s.h IoPortMemObj = NIL_RTR0MEMOBJ;42 void iomR0MmioInitPerVMData(PGVM pGVM) 43 { 44 pGVM->iomr0.s.hMmioMapObj = NIL_RTR0MEMOBJ; 45 pGVM->iomr0.s.hMmioMemObj = NIL_RTR0MEMOBJ; 46 46 #ifdef VBOX_WITH_STATISTICS 47 pGVM->iomr0.s.h IoPortStatsMapObj = NIL_RTR0MEMOBJ;48 pGVM->iomr0.s.h IoPortStatsMemObj = NIL_RTR0MEMOBJ;47 pGVM->iomr0.s.hMmioStatsMapObj = NIL_RTR0MEMOBJ; 48 pGVM->iomr0.s.hMmioStatsMemObj = NIL_RTR0MEMOBJ; 49 49 #endif 50 50 } … … 52 52 53 53 /** 54 * Cleans up I/O portrelated resources.55 */ 56 void iomR0 IoPortCleanupVM(PGVM pGVM)57 { 58 RTR0MemObjFree(pGVM->iomr0.s.h IoPortMapObj, true /*fFreeMappings*/);59 pGVM->iomr0.s.h IoPortMapObj = NIL_RTR0MEMOBJ;60 RTR0MemObjFree(pGVM->iomr0.s.h IoPortMemObj, true /*fFreeMappings*/);61 pGVM->iomr0.s.h IoPortMemObj = NIL_RTR0MEMOBJ;54 * Cleans up MMIO related resources. 55 */ 56 void 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; 62 62 #ifdef VBOX_WITH_STATISTICS 63 RTR0MemObjFree(pGVM->iomr0.s.h IoPortStatsMapObj, true /*fFreeMappings*/);64 pGVM->iomr0.s.h IoPortStatsMapObj = NIL_RTR0MEMOBJ;65 RTR0MemObjFree(pGVM->iomr0.s.h IoPortStatsMemObj, true /*fFreeMappings*/);66 pGVM->iomr0.s.h IoPortStatsMemObj = 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; 67 67 #endif 68 68 } … … 70 70 71 71 /** 72 * Implements PDMDEVHLPR0::pfn IoPortSetUpContext.72 * Implements PDMDEVHLPR0::pfnMmioSetUpContext. 73 73 * 74 74 * @param pGVM The global (ring-0) VM structure. 75 75 * @param pDevIns The device instance. 76 * @param h IoPorts The I/O port handle (already registered in ring-3).77 * @param pfnOut The OUT handler callback, optional.78 * @param pfn In The INhandler callback, optional.79 * @param pfn OutStr The REP OUTShandler callback, optional.80 * @param pfn InStr The REP INShandler 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. 81 81 * @param pvUser User argument for the callbacks. 82 82 * @thread EMT(0) 83 83 * @note Only callable at VM creation time. 84 84 */ 85 VMMR0_INT_DECL(int) IOMR0IoPortSetUpContext(PGVM pGVM, PPDMDEVINS pDevIns, IOMIOPORTHANDLE hIoPorts, 86 PFNIOMIOPORTNEWOUT pfnOut, PFNIOMIOPORTNEWIN pfnIn, 87 PFNIOMIOPORTNEWOUTSTRING pfnOutStr, PFNIOMIOPORTNEWINSTRING pfnInStr, void *pvUser) 85 VMMR0_INT_DECL(int) IOMR0MmioSetUpContext(PGVM pGVM, PPDMDEVINS pDevIns, IOMMMIOHANDLE hRegion, PFNIOMMMIONEWWRITE pfnWrite, 86 PFNIOMMMIONEWREAD pfnRead, PFNIOMMMIONEWFILL pfnFill, void *pvUser) 88 87 { 89 88 /* … … 92 91 VM_ASSERT_EMT0_RETURN(pGVM, VERR_VM_THREAD_NOT_EMT); 93 92 VM_ASSERT_STATE_RETURN(pGVM, VMSTATE_CREATING, VERR_VM_INVALID_VM_STATE); 94 AssertReturn(h IoPorts < pGVM->iomr0.s.cIoPortAlloc, VERR_IOM_INVALID_IOPORT_HANDLE);95 AssertReturn(h IoPorts < 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); 96 95 AssertPtrReturn(pDevIns, VERR_INVALID_HANDLE); 97 96 AssertReturn(pDevIns->pDevInsForR3 != NIL_RTR3PTR && !(pDevIns->pDevInsForR3 & PAGE_OFFSET_MASK), VERR_INVALID_PARAMETER); 98 AssertReturn(pGVM->iomr0.s.pa IoPortRing3Regs[hIoPorts].pDevIns == pDevIns->pDevInsForR3, VERR_IOM_INVALID_IOPORT_HANDLE);99 AssertReturn(pGVM->iomr0.s.pa IoPortRegs[hIoPorts].pDevIns == NULL, VERR_WRONG_ORDER);100 101 AssertReturn(pfnOut || pfnIn || pfnOutStr || pfnInStr, VERR_INVALID_PARAMETER); 102 Assert PtrNullReturn(pfnOut, VERR_INVALID_POINTER);103 AssertPtrNullReturn(pfn In, VERR_INVALID_POINTER);104 AssertPtrNullReturn(pfn OutStr, VERR_INVALID_POINTER);105 AssertPtrNullReturn(pfn InStr, VERR_INVALID_POINTER);106 107 uint 16_t const fFlags = pGVM->iomr0.s.paIoPortRing3Regs[hIoPorts].fFlags;108 RT IOPORT const cPorts = pGVM->iomr0.s.paIoPortRing3Regs[hIoPorts].cPorts;109 AssertMsgReturn(c Ports > 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); 110 109 111 110 /* 112 111 * Do the job. 113 112 */ 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; 122 120 #ifdef VBOX_WITH_STATISTICS 123 uint16_t const idxStats = pGVM->iomr0.s.pa IoPortRing3Regs[hIoPorts].idxStats;124 pGVM->iomr0.s.pa IoPortRegs[hIoPorts].idxStats = (uint32_t)idxStats + cPorts <= pGVM->iomr0.s.cIoPortStatsAllocation125 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; 126 124 #else 127 pGVM->iomr0.s.pa IoPortRegs[hIoPorts].idxStats= UINT16_MAX;125 pGVM->iomr0.s.paMmioRegs[hRegion].idxStats = UINT16_MAX; 128 126 #endif 129 127 130 pGVM->iomr0.s.pa IoPortRing3Regs[hIoPorts].fRing0 = true;128 pGVM->iomr0.s.paMmioRing3Regs[hRegion].fRing0 = true; 131 129 132 130 return VINF_SUCCESS; … … 135 133 136 134 /** 137 * Grows the I/O portregistration (all contexts) and lookup tables.135 * Grows the MMIO registration (all contexts) and lookup tables. 138 136 * 139 137 * @returns VBox status code. … … 143 141 * @note Only callable at VM creation time. 144 142 */ 145 VMMR0_INT_DECL(int) IOMR0 IoPortGrowRegistrationTables(PGVM pGVM, uint64_t cReqMinEntries)143 VMMR0_INT_DECL(int) IOMR0MmioGrowRegistrationTables(PGVM pGVM, uint64_t cReqMinEntries) 146 144 { 147 145 /* … … 150 148 VM_ASSERT_EMT0_RETURN(pGVM, VERR_VM_THREAD_NOT_EMT); 151 149 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); 153 151 uint32_t cNewEntries = (uint32_t)cReqMinEntries; 154 AssertReturn(cNewEntries >= pGVM->iom.s.c IoPortAlloc, VERR_IOM_IOPORT_IPE_1);155 uint32_t const cOldEntries = pGVM->iomr0.s.c IoPortAlloc;152 AssertReturn(cNewEntries >= pGVM->iom.s.cMmioAlloc, VERR_IOM_MMIO_IPE_1); 153 uint32_t const cOldEntries = pGVM->iomr0.s.cMmioAlloc; 156 154 ASMCompilerBarrier(); 157 AssertReturn(cNewEntries >= cOldEntries, VERR_IOM_ IOPORT_IPE_2);158 AssertReturn(pGVM->iom.s.c IoPortRegs >= 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); 159 157 160 158 /* … … 162 160 * ring-3, lookup) and does a partial mapping of the result to ring-3. 163 161 */ 164 uint32_t const cbRing0 = RT_ALIGN_32(cNewEntries * sizeof(IOM IOPORTENTRYR0), PAGE_SIZE);165 uint32_t const cbRing3 = RT_ALIGN_32(cNewEntries * sizeof(IOM IOPORTENTRYR3), PAGE_SIZE);166 uint32_t const cbShared = RT_ALIGN_32(cNewEntries * sizeof(IOM IOPORTLOOKUPENTRY), 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); 167 165 uint32_t const cbNew = cbRing0 + cbRing3 + cbShared; 168 166 169 167 /* Use the rounded up space as best we can. */ 170 cNewEntries = RT_MIN(RT_MIN(cbRing0 / sizeof(IOM IOPORTENTRYR0), cbRing3 / sizeof(IOMIOPORTENTRYR3)),171 cbShared / sizeof(IOM IOPORTLOOKUPENTRY));168 cNewEntries = RT_MIN(RT_MIN(cbRing0 / sizeof(IOMMMIOENTRYR0), cbRing3 / sizeof(IOMMMIOENTRYR3)), 169 cbShared / sizeof(IOMMMIOLOOKUPENTRY)); 172 170 173 171 RTR0MEMOBJ hMemObj; … … 185 183 if (RT_SUCCESS(rc)) 186 184 { 187 PIOM IOPORTENTRYR0 const paRing0 = (PIOMIOPORTENTRYR0)RTR0MemObjAddress(hMemObj);188 PIOM IOPORTENTRYR3 const paRing3 = (PIOMIOPORTENTRYR3)((uintptr_t)paRing0 + cbRing0);189 PIOM IOPORTLOOKUPENTRY 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); 190 188 RTR3UINTPTR const uAddrRing3 = RTR0MemObjAddressR3(hMapObj); 191 189 … … 193 191 * Copy over the old info and initialize the idxSelf and idxStats members. 194 192 */ 195 if (pGVM->iomr0.s.pa IoPortRegs != NULL)193 if (pGVM->iomr0.s.paMmioRegs != NULL) 196 194 { 197 memcpy(paRing0, pGVM->iomr0.s.pa IoPortRegs, sizeof(paRing0[0]) * cOldEntries);198 memcpy(paRing3, pGVM->iomr0.s.pa IoPortRing3Regs, sizeof(paRing3[0]) * cOldEntries);199 memcpy(paLookup, pGVM->iomr0.s.pa IoPortLookup, 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); 200 198 } 201 199 … … 212 210 * Switch the memory handles. 213 211 */ 214 RTR0MEMOBJ hTmp = pGVM->iomr0.s.h IoPortMapObj;215 pGVM->iomr0.s.h IoPortMapObj = hMapObj;212 RTR0MEMOBJ hTmp = pGVM->iomr0.s.hMmioMapObj; 213 pGVM->iomr0.s.hMmioMapObj = hMapObj; 216 214 hMapObj = hTmp; 217 215 218 hTmp = pGVM->iomr0.s.h IoPortMemObj;219 pGVM->iomr0.s.h IoPortMemObj = hMemObj;216 hTmp = pGVM->iomr0.s.hMmioMemObj; 217 pGVM->iomr0.s.hMmioMemObj = hMemObj; 220 218 hMemObj = hTmp; 221 219 … … 223 221 * Update the variables. 224 222 */ 225 pGVM->iomr0.s.pa IoPortRegs = paRing0;226 pGVM->iomr0.s.pa IoPortRing3Regs = paRing3;227 pGVM->iomr0.s.pa IoPortLookup = paLookup;228 pGVM->iom.s.pa IoPortRegs = uAddrRing3;229 pGVM->iom.s.pa IoPortLookup = uAddrRing3 + cbRing3;230 pGVM->iom.s.c IoPortAlloc = cNewEntries;231 pGVM->iomr0.s.c IoPortAlloc = 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; 232 230 233 231 /* … … 244 242 245 243 /** 246 * Grows the I/O portstatistics table.244 * Grows the MMIO statistics table. 247 245 * 248 246 * @returns VBox status code. … … 252 250 * @note Only callable at VM creation time. 253 251 */ 254 VMMR0_INT_DECL(int) IOMR0 IoPortGrowStatisticsTable(PGVM pGVM, uint64_t cReqMinEntries)252 VMMR0_INT_DECL(int) IOMR0MmioGrowStatisticsTable(PGVM pGVM, uint64_t cReqMinEntries) 255 253 { 256 254 /* … … 259 257 VM_ASSERT_EMT0_RETURN(pGVM, VERR_VM_THREAD_NOT_EMT); 260 258 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); 262 260 uint32_t cNewEntries = (uint32_t)cReqMinEntries; 263 261 #ifdef VBOX_WITH_STATISTICS 264 uint32_t const cOldEntries = pGVM->iomr0.s.c IoPortStatsAllocation;262 uint32_t const cOldEntries = pGVM->iomr0.s.cMmioStatsAllocation; 265 263 ASMCompilerBarrier(); 266 264 #else 267 265 uint32_t const cOldEntries = 0; 268 266 #endif 269 AssertReturn(cNewEntries > cOldEntries, VERR_IOM_ IOPORT_IPE_1);270 AssertReturn(pGVM->iom.s.c IoPortStatsAllocation == cOldEntries, VERR_IOM_IOPORT_IPE_1);271 AssertReturn(pGVM->iom.s.c IoPortStats <= 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); 272 270 273 271 /* … … 277 275 AssertFailedReturn(VERR_NOT_SUPPORTED); 278 276 #else 279 uint32_t const cbNew = RT_ALIGN_32(cNewEntries * sizeof(IOM IOPORTSTATSENTRY), PAGE_SIZE);280 cNewEntries = cbNew / sizeof(IOM IOPORTSTATSENTRY);277 uint32_t const cbNew = RT_ALIGN_32(cNewEntries * sizeof(IOMMMIOSTATSENTRY), PAGE_SIZE); 278 cNewEntries = cbNew / sizeof(IOMMMIOSTATSENTRY); 281 279 282 280 RTR0MEMOBJ hMemObj; … … 290 288 if (RT_SUCCESS(rc)) 291 289 { 292 PIOM IOPORTSTATSENTRY pIoPortStats = (PIOMIOPORTSTATSENTRY)RTR0MemObjAddress(hMemObj);290 PIOMMMIOSTATSENTRY pMmioStats = (PIOMMMIOSTATSENTRY)RTR0MemObjAddress(hMemObj); 293 291 294 292 /* 295 293 * Anything to copy over and free up? 296 294 */ 297 if (pGVM->iomr0.s.pa IoPortStats)298 memcpy(p IoPortStats, pGVM->iomr0.s.paIoPortStats, cOldEntries * sizeof(IOMIOPORTSTATSENTRY));295 if (pGVM->iomr0.s.paMmioStats) 296 memcpy(pMmioStats, pGVM->iomr0.s.paMmioStats, cOldEntries * sizeof(IOMMMIOSTATSENTRY)); 299 297 300 298 /* 301 299 * Switch the memory handles. 302 300 */ 303 RTR0MEMOBJ hTmp = pGVM->iomr0.s.h IoPortStatsMapObj;304 pGVM->iomr0.s.h IoPortStatsMapObj = hMapObj;301 RTR0MEMOBJ hTmp = pGVM->iomr0.s.hMmioStatsMapObj; 302 pGVM->iomr0.s.hMmioStatsMapObj = hMapObj; 305 303 hMapObj = hTmp; 306 304 307 hTmp = pGVM->iomr0.s.h IoPortStatsMemObj;308 pGVM->iomr0.s.h IoPortStatsMemObj = hMemObj;305 hTmp = pGVM->iomr0.s.hMmioStatsMemObj; 306 pGVM->iomr0.s.hMmioStatsMemObj = hMemObj; 309 307 hMemObj = hTmp; 310 308 … … 312 310 * Update the variables. 313 311 */ 314 pGVM->iomr0.s.pa IoPortStats = pIoPortStats;315 pGVM->iom.s.pa IoPortStats = RTR0MemObjAddressR3(pGVM->iomr0.s.hIoPortStatsMapObj);316 pGVM->iom.s.c IoPortStatsAllocation = cNewEntries;317 pGVM->iomr0.s.c IoPortStatsAllocation = 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; 318 316 319 317 /* -
trunk/src/VBox/VMM/VMMR0/PDMR0Device.cpp
r81160 r81197 214 214 PFNIOMMMIONEWREAD pfnRead, PFNIOMMMIONEWFILL pfnFill, void *pvUser) 215 215 { 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; 218 227 } 219 228 -
trunk/src/VBox/VMM/VMMR0/VMMR0.cpp
r81167 r81197 2203 2203 if (pReqHdr || idCpu != 0) 2204 2204 return VERR_INVALID_PARAMETER; 2205 rc = VERR_NOT_SUPPORTED; //rc =IOMR0MmioGrowRegistrationTables(pGVM, u64Arg);2205 rc = IOMR0MmioGrowRegistrationTables(pGVM, u64Arg); 2206 2206 VMM_CHECK_SMAP_CHECK2(pGVM, RT_NOTHING); 2207 2207 break; … … 2212 2212 if (pReqHdr || idCpu != 0) 2213 2213 return VERR_INVALID_PARAMETER; 2214 rc = VERR_NOT_SUPPORTED; //rc =IOMR0MmioGrowStatisticsTable(pGVM, u64Arg);2214 rc = IOMR0MmioGrowStatisticsTable(pGVM, u64Arg); 2215 2215 VMM_CHECK_SMAP_CHECK2(pGVM, RT_NOTHING); 2216 2216 break; -
trunk/src/VBox/VMM/VMMR3/IOMR3Mmio.cpp
r81167 r81197 186 186 187 187 RTGCPHYS const cbRegion = pRegEntry->cbRegion; 188 AssertMsgReturn(cbRegion > 0 && cbRegion <= _1 P, ("cbRegion=%RGp\n", cbRegion), VERR_IOM_MMIO_IPE_1);188 AssertMsgReturn(cbRegion > 0 && cbRegion <= _1T, ("cbRegion=%RGp\n", cbRegion), VERR_IOM_MMIO_IPE_1); 189 189 AssertReturn(GCPhys + cbRegion <= GCPhys, VERR_OUT_OF_RANGE); 190 190 RTGCPHYS const GCPhysLast = GCPhys + cbRegion - 1; -
trunk/src/VBox/VMM/include/IOMInternal.h
r81167 r81197 808 808 /** MMIO registration table for ring-0. 809 809 * There is a parallel table for ring-3, paMmioRing3Regs. */ 810 R0PTRTYPE(PIOM IOPORTENTRYR0)paMmioRegs;810 R0PTRTYPE(PIOMMMIOENTRYR0) paMmioRegs; 811 811 /** MMIO lookup table. */ 812 R0PTRTYPE(PIOM IOPORTLOOKUPENTRY)paMmioLookup;812 R0PTRTYPE(PIOMMMIOLOOKUPENTRY) paMmioLookup; 813 813 /** MMIO registration table for ring-3. 814 814 * Also mapped to ring-3 as IOM::paMmioRegs. */ 815 R0PTRTYPE(PIOM IOPORTENTRYR3)paMmioRing3Regs;815 R0PTRTYPE(PIOMMMIOENTRYR3) paMmioRing3Regs; 816 816 /** Handle to the allocation backing both the ring-0 and ring-3 registration 817 817 * tables as well as the lookup table. */ … … 823 823 uint32_t cMmioStatsAllocation; 824 824 /** MMIO lookup table. */ 825 R0PTRTYPE(PIOM IOPORTSTATSENTRY)paMmioStats;825 R0PTRTYPE(PIOMMMIOSTATSENTRY) paMmioStats; 826 826 /** Handle to the allocation backing the MMIO statistics. */ 827 827 RTR0MEMOBJ hMmioStatsMemObj; … … 845 845 void iomR0IoPortCleanupVM(PGVM pGVM); 846 846 void iomR0IoPortInitPerVMData(PGVM pGVM); 847 void iomR0MmioCleanupVM(PGVM pGVM); 848 void iomR0MmioInitPerVMData(PGVM pGVM); 847 849 #endif 848 850
Note:
See TracChangeset
for help on using the changeset viewer.