Changeset 87478 in vbox for trunk/src/VBox/VMM/VMMAll
- Timestamp:
- Jan 29, 2021 1:42:32 PM (4 years ago)
- svn:sync-xref-src-repo-rev:
- 142500
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/PDMAllIommu.cpp
r87477 r87478 27 27 #ifdef IN_RING3 28 28 # include <iprt/mem.h> 29 #endif 30 31 32 /********************************************************************************************************************************* 33 * Defined Constants And Macros * 34 *********************************************************************************************************************************/ 35 /** 36 * Gets the PDM IOMMU for the current context from the PDM device instance. 37 */ 38 #ifdef IN_RING0 39 #define PDMDEVINS_TO_IOMMU(a_pDevIns) &(a_pDevIns)->Internal.s.pGVM->pdmr0.s.aIommus[0]; 40 #else 41 #define PDMDEVINS_TO_IOMMU(a_pDevIns) &(a_pDevIns)->Internal.s.pVMR3->pdm.s.aIommus[0]; 29 42 #endif 30 43 … … 53 66 54 67 55 #if 056 /* Hmpf. We have no PPDMIOMMUR3 ... */57 DECL_FORCE_INLINE(PPDMDEVINS) pdmIommuGetInstance(PPDMDEVINS pDevIns)58 {59 #if defined(IN_RING0)60 PGVM pGVM = pDevIns->Internal.s.pGVM;61 PPDMIOMMUR0 pIommu = &pGVM->pdmr0.s.aIommus[0];62 #else63 PVM pVM = pDevIns->Internal.s.pVMR3;64 PPDMIOMMU pIommu = &pVM->pdm.s.aIommus[0];65 #endif66 return pIommu->CTX_SUFF(pDevIns);67 }68 #endif69 70 71 68 /** 72 69 * Bus master physical memory read after translating the physical address using the … … 87 84 int pdmIommuMemAccessRead(PPDMDEVINS pDevIns, PPDMPCIDEV pPciDev, RTGCPHYS GCPhys, void *pvBuf, size_t cbRead, uint32_t fFlags) 88 85 { 89 /** @todo IOMMU: Optimize/re-organize things here later. */ 90 #if defined(IN_RING0) 91 PGVM pGVM = pDevIns->Internal.s.pGVM; 92 PPDMIOMMUR0 pIommu = &pGVM->pdmr0.s.aIommus[0]; 93 PPDMDEVINS pDevInsIommu = pIommu->CTX_SUFF(pDevIns); 86 PPDMIOMMU pIommu = PDMDEVINS_TO_IOMMU(pDevIns); 87 PPDMDEVINS pDevInsIommu = pIommu->CTX_SUFF(pDevIns); 94 88 if ( pDevInsIommu 95 89 && pDevInsIommu != pDevIns) … … 105 99 { 106 100 /** @todo Handle strict return codes from PGMPhysRead. */ 107 rc = pDevIns-> pHlpR0->pfnPhysRead(pDevIns, GCPhysOut, pvBuf, cbRead, fFlags);101 rc = pDevIns->CTX_SUFF(pHlp)->pfnPhysRead(pDevIns, GCPhysOut, pvBuf, cbRead, fFlags); 108 102 if (RT_SUCCESS(rc)) 109 103 { … … 117 111 else 118 112 { 119 LogFunc(("R0: IOMMU memory read failed. uDeviceId=%#x GCPhys=%#RGp cb=%u rc=%Rrc\n", uDeviceId, GCPhys, cbRead, 120 rc)); 113 LogFunc(("IOMMU memory read failed. uDeviceId=%#x GCPhys=%#RGp cb=%zu rc=%Rrc\n", uDeviceId, GCPhys, cbRead, rc)); 121 114 break; 122 115 } … … 124 117 return rc; 125 118 } 126 127 return VERR_IOMMU_NOT_PRESENT; 128 #elif defined(IN_RING3) 129 PVM pVM = pDevIns->Internal.s.pVMR3; 130 PPDMIOMMU pIommu = &pVM->pdm.s.aIommus[0]; 131 PPDMDEVINS pDevInsIommu = pIommu->CTX_SUFF(pDevIns); 132 if ( pDevInsIommu 133 && pDevInsIommu != pDevIns) 134 { 135 uint16_t const uDeviceId = pdmIommuGetPciDeviceId(pDevIns, pPciDev); 136 int rc = VINF_SUCCESS; 137 while (cbRead > 0) 138 { 139 RTGCPHYS GCPhysOut; 140 size_t cbContig; 141 rc = pIommu->pfnMemAccess(pDevInsIommu, uDeviceId, GCPhys, cbRead, PDMIOMMU_MEM_F_READ, &GCPhysOut, &cbContig); 142 if (RT_SUCCESS(rc)) 143 { 144 /** @todo Handle strict return codes from PGMPhysRead. */ 145 rc = pDevIns->pHlpR3->pfnPhysRead(pDevIns, GCPhysOut, pvBuf, cbRead, fFlags); 146 if (RT_SUCCESS(rc)) 147 { 148 cbRead -= cbContig; 149 pvBuf = (void *)((uintptr_t)pvBuf + cbContig); 150 GCPhys += cbContig; 151 } 152 else 153 break; 154 } 155 else 156 { 157 LogFunc(("R3: IOMMU memory read failed. uDeviceId=%#x GCPhys=%#RGp cb=%u rc=%Rrc\n", uDeviceId, GCPhys, cbRead, 158 rc)); 159 break; 160 } 161 } 162 return rc; 163 } 164 165 return VERR_IOMMU_NOT_PRESENT; 166 #else 167 # error "Implement me." 168 #endif 119 return VERR_IOMMU_NOT_PRESENT; 169 120 } 170 121 … … 189 140 uint32_t fFlags) 190 141 { 191 /** @todo IOMMU: Optimize/re-organize things here later. */ 192 #if defined(IN_RING0) 193 PGVM pGVM = pDevIns->Internal.s.pGVM; 194 PPDMIOMMUR0 pIommu = &pGVM->pdmr0.s.aIommus[0]; 195 PPDMDEVINS pDevInsIommu = pIommu->CTX_SUFF(pDevIns); 142 PPDMIOMMU pIommu = PDMDEVINS_TO_IOMMU(pDevIns); 143 PPDMDEVINS pDevInsIommu = pIommu->CTX_SUFF(pDevIns); 196 144 if ( pDevInsIommu 197 145 && pDevInsIommu != pDevIns) … … 207 155 { 208 156 /** @todo Handle strict return codes from PGMPhysWrite. */ 209 rc = pDevIns-> pHlpR0->pfnPhysWrite(pDevIns, GCPhysOut, pvBuf, cbWrite, fFlags);157 rc = pDevIns->CTX_SUFF(pHlp)->pfnPhysWrite(pDevIns, GCPhysOut, pvBuf, cbWrite, fFlags); 210 158 if (RT_SUCCESS(rc)) 211 159 { … … 219 167 else 220 168 { 221 LogFunc((" R0: IOMMU memory write failed. uDeviceId=%#x GCPhys=%#RGp cb=%u rc=%Rrc\n", uDeviceId, GCPhys, cbWrite,169 LogFunc(("IOMMU memory write failed. uDeviceId=%#x GCPhys=%#RGp cb=%zu rc=%Rrc\n", uDeviceId, GCPhys, cbWrite, 222 170 rc)); 223 171 break; … … 226 174 return rc; 227 175 } 228 229 return VERR_IOMMU_NOT_PRESENT; 230 #elif defined(IN_RING3) 231 PVM pVM = pDevIns->Internal.s.pVMR3; 232 PPDMIOMMU pIommu = &pVM->pdm.s.aIommus[0]; 233 PPDMDEVINS pDevInsIommu = pIommu->CTX_SUFF(pDevIns); 234 if ( pDevInsIommu 235 && pDevInsIommu != pDevIns) 236 { 237 uint16_t const uDeviceId = pdmIommuGetPciDeviceId(pDevIns, pPciDev); 238 int rc = VINF_SUCCESS; 239 while (cbWrite > 0) 240 { 241 RTGCPHYS GCPhysOut; 242 size_t cbContig; 243 rc = pIommu->pfnMemAccess(pDevInsIommu, uDeviceId, GCPhys, cbWrite, PDMIOMMU_MEM_F_WRITE, &GCPhysOut, &cbContig); 244 if (RT_SUCCESS(rc)) 245 { 246 /** @todo Handle strict return codes from PGMPhysWrite. */ 247 rc = pDevIns->pHlpR3->pfnPhysWrite(pDevIns, GCPhysOut, pvBuf, cbContig, fFlags); 248 if (RT_SUCCESS(rc)) 249 { 250 cbWrite -= cbContig; 251 pvBuf = (const void *)((uintptr_t)pvBuf + cbContig); 252 GCPhys += cbContig; 253 } 254 else 255 break; 256 } 257 else 258 { 259 LogFunc(("R3: IOMMU memory write failed. uDeviceId=%#x GCPhys=%#RGp cb=%u rc=%Rrc\n", uDeviceId, GCPhys, cbWrite, 260 rc)); 261 break; 262 } 263 } 264 return rc; 265 } 266 267 return VERR_IOMMU_NOT_PRESENT; 268 #else 269 # error "Implement me." 270 #endif 176 return VERR_IOMMU_NOT_PRESENT; 271 177 } 272 178 … … 294 200 { 295 201 #if defined(IN_RING3) 296 PVM pVM = pDevIns->Internal.s.pVMR3; 297 PPDMIOMMU pIommu = &pVM->pdm.s.aIommus[0]; 202 PPDMIOMMU pIommu = PDMDEVINS_TO_IOMMU(pDevIns); 298 203 PPDMDEVINS pDevInsIommu = pIommu->CTX_SUFF(pDevIns); 299 204 if ( pDevInsIommu … … 315 220 return rc; 316 221 } 317 318 222 return VERR_IOMMU_NOT_PRESENT; 319 223 #else … … 346 250 { 347 251 #if defined(IN_RING3) 348 PVM pVM = pDevIns->Internal.s.pVMR3; 349 PPDMIOMMU pIommu = &pVM->pdm.s.aIommus[0]; 252 PPDMIOMMU pIommu = PDMDEVINS_TO_IOMMU(pDevIns); 350 253 PPDMDEVINS pDevInsIommu = pIommu->CTX_SUFF(pDevIns); 351 254 if ( pDevInsIommu … … 367 270 return rc; 368 271 } 369 370 272 return VERR_IOMMU_NOT_PRESENT; 371 273 #else … … 401 303 { 402 304 #ifdef IN_RING3 403 PVM pVM = pDevIns->Internal.s.pVMR3; 404 PPDMIOMMU pIommu = &pVM->pdm.s.aIommus[0]; 305 PPDMIOMMU pIommu = PDMDEVINS_TO_IOMMU(pDevIns); 405 306 PPDMDEVINS pDevInsIommu = pIommu->CTX_SUFF(pDevIns); 406 307 if ( pDevInsIommu … … 437 338 return rc; 438 339 } 439 440 340 return VERR_IOMMU_NOT_PRESENT; 441 341 #else … … 471 371 { 472 372 #ifdef IN_RING3 473 PVM pVM = pDevIns->Internal.s.pVMR3; 474 PPDMIOMMU pIommu = &pVM->pdm.s.aIommus[0]; 373 PPDMIOMMU pIommu = PDMDEVINS_TO_IOMMU(pDevIns); 475 374 PPDMDEVINS pDevInsIommu = pIommu->CTX_SUFF(pDevIns); 476 375 if ( pDevInsIommu … … 507 406 return rc; 508 407 } 509 510 408 return VERR_IOMMU_NOT_PRESENT; 511 409 #else … … 519 417 int pdmIommuMsiRemap(PPDMDEVINS pDevIns, uint16_t uDeviceId, PCMSIMSG pMsiIn, PMSIMSG pMsiOut) 520 418 { 521 #if defined(IN_RING0) 522 PGVM pGVM = pDevIns->Internal.s.pGVM; 523 PPDMIOMMUR0 pIommu = &pGVM->pdmr0.s.aIommus[0]; 524 PPDMDEVINS pDevInsIommu = pIommu->CTX_SUFF(pDevIns); 419 PPDMIOMMU pIommu = PDMDEVINS_TO_IOMMU(pDevIns); 420 PPDMDEVINS pDevInsIommu = pIommu->CTX_SUFF(pDevIns); 525 421 if ( pDevInsIommu 526 422 && pDevInsIommu != pDevIns) … … 529 425 if (RT_FAILURE(rc)) 530 426 { 531 LogFunc((" R0:MSI remap failed. uDeviceId=%#x pMsiIn=(%#RX64, %#RU32) rc=%Rrc\n", uDeviceId, pMsiIn->Addr.u64,427 LogFunc(("MSI remap failed. uDeviceId=%#x pMsiIn=(%#RX64, %#RU32) rc=%Rrc\n", uDeviceId, pMsiIn->Addr.u64, 532 428 pMsiIn->Data.u32, rc)); 533 429 } 534 430 return rc; 535 431 } 536 537 return VERR_IOMMU_NOT_PRESENT; 538 #elif defined(IN_RING3) 539 PVM pVM = pDevIns->Internal.s.pVMR3; 540 PPDMIOMMU pIommu = &pVM->pdm.s.aIommus[0]; 541 PPDMDEVINS pDevInsIommu = pIommu->CTX_SUFF(pDevIns); 542 if ( pDevInsIommu 543 && pDevInsIommu != pDevIns) 544 { 545 int rc = pIommu->pfnMsiRemap(pDevInsIommu, uDeviceId, pMsiIn, pMsiOut); 546 if (RT_FAILURE(rc)) 547 { 548 LogFunc(("R3: MSI remap failed. uDeviceId=%#x pMsiIn=(%#RX64, %#RU32) rc=%Rrc\n", uDeviceId, pMsiIn->Addr.u64, 549 pMsiIn->Data.u32, rc)); 550 } 551 return rc; 552 } 553 554 return VERR_IOMMU_NOT_PRESENT; 555 #else 556 # error "Implement me." 557 #endif 558 } 559 432 return VERR_IOMMU_NOT_PRESENT; 433 } 434
Note:
See TracChangeset
for help on using the changeset viewer.