- Timestamp:
- Sep 18, 2008 12:42:54 PM (16 years ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/HWACCMInternal.h
r12554 r12566 34 34 #include <iprt/mp.h> 35 35 36 ////#define VBOX_WITH_HWACCM_DEBUG_REGISTER_SUPPORT36 #define VBOX_WITH_HWACCM_DEBUG_REGISTER_SUPPORT 37 37 38 38 #if HC_ARCH_BITS == 64 -
trunk/src/VBox/VMM/IOM.cpp
r12561 r12566 67 67 #include <VBox/log.h> 68 68 #include <VBox/err.h> 69 70 71 /*******************************************************************************72 * Structures and Typedefs *73 *******************************************************************************/74 /**75 * pvUser argument of the iomr3RelocateMMIOCallback callback.76 */77 typedef struct IOMMMIOCALLBACKARGS78 {79 PVM pVM;80 RTGCINTPTR offDelta;81 } IOMMMIOCALLBACKARGS;82 typedef IOMMMIOCALLBACKARGS *PIOMMMIOCALLBACKARGS;83 69 84 70 … … 239 225 */ 240 226 pVM->iom.s.pTreesGC = MMHyperHC2GC(pVM, pVM->iom.s.pTreesHC); 241 242 IOMMMIOCALLBACKARGS Args;243 Args.pVM = pVM;244 Args.offDelta = offDelta;245 246 227 RTAvlroIOPortDoWithAll(&pVM->iom.s.pTreesHC->IOPortTreeGC, true, iomr3RelocateIOPortCallback, &offDelta); 247 RTAvlroGCPhysDoWithAll(&pVM->iom.s.pTreesHC->MMIOTree, true, iomr3RelocateMMIOCallback, & Args);228 RTAvlroGCPhysDoWithAll(&pVM->iom.s.pTreesHC->MMIOTree, true, iomr3RelocateMMIOCallback, &offDelta); 248 229 249 230 if (pVM->iom.s.pfnMMIOHandlerGC) … … 307 288 static DECLCALLBACK(int) iomr3RelocateMMIOCallback(PAVLROGCPHYSNODECORE pNode, void *pvUser) 308 289 { 309 PIOMMMIORANGE pRange = (PIOMMMIORANGE)pNode; 310 PIOMMMIOCALLBACKARGS pArgs = (PIOMMMIOCALLBACKARGS)pvUser; 311 PVM pVM = pArgs->pVM; 312 RTGCINTPTR offDelta = pArgs->offDelta; 313 314 for (uint32_t i = 0; i < pVM->cCPUs; i++) 315 { 316 if (pRange->a[i].pDevInsGC) 317 pRange->a[i].pDevInsGC += offDelta; 318 if (pRange->a[i].pvUserGC > _64K) 319 pRange->a[i].pvUserGC += offDelta; 320 } 290 PIOMMMIORANGE pRange = (PIOMMMIORANGE)pNode; 291 RTGCINTPTR offDelta = *(PRTGCINTPTR)pvUser; 292 293 if (pRange->pDevInsGC) 294 pRange->pDevInsGC += offDelta; 321 295 if (pRange->pfnWriteCallbackGC) 322 296 pRange->pfnWriteCallbackGC += offDelta; … … 325 299 if (pRange->pfnFillCallbackGC) 326 300 pRange->pfnFillCallbackGC += offDelta; 301 if (pRange->pvUserGC > _64K) 302 pRange->pvUserGC += offDelta; 327 303 328 304 return 0; … … 1412 1388 * @param pVM VM handle. 1413 1389 * @param pDevIns PDM device instance owning the MMIO range. 1414 * @param enmCtx CPU id or IOMMMIOCTX_GLOBAL if it's a global registration (applies to all CPUs)1415 1390 * @param GCPhysStart First physical address in the range. 1416 1391 * @param cbRange The size of the range (in bytes). … … 1421 1396 * @param pszDesc Pointer to description string. This must not be freed. 1422 1397 */ 1423 IOMR3DECL(int) IOMR3MMIORegisterR3(PVM pVM, PPDMDEVINS pDevIns, IOMMMIOCTX enmCtx,RTGCPHYS GCPhysStart, RTUINT cbRange, RTHCPTR pvUser,1398 IOMR3DECL(int) IOMR3MMIORegisterR3(PVM pVM, PPDMDEVINS pDevIns, RTGCPHYS GCPhysStart, RTUINT cbRange, RTHCPTR pvUser, 1424 1399 R3PTRTYPE(PFNIOMMMIOWRITE) pfnWriteCallback, R3PTRTYPE(PFNIOMMMIOREAD) pfnReadCallback, 1425 1400 R3PTRTYPE(PFNIOMMMIOFILL) pfnFillCallback, const char *pszDesc) 1426 1401 { 1427 LogFlow(("IOMR3MMIORegisterR3: pDevIns=%p CPU=%dGCPhysStart=%VGp cbRange=%#x pvUser=%VHv pfnWriteCallback=%#x pfnReadCallback=%#x pfnFillCallback=%#x pszDesc=%s\n",1428 pDevIns, enmCtx,GCPhysStart, cbRange, pvUser, pfnWriteCallback, pfnReadCallback, pfnFillCallback, pszDesc));1402 LogFlow(("IOMR3MMIORegisterR3: pDevIns=%p GCPhysStart=%VGp cbRange=%#x pvUser=%VHv pfnWriteCallback=%#x pfnReadCallback=%#x pfnFillCallback=%#x pszDesc=%s\n", 1403 pDevIns, GCPhysStart, cbRange, pvUser, pfnWriteCallback, pfnReadCallback, pfnFillCallback, pszDesc)); 1429 1404 int rc; 1430 1405 … … 1437 1412 return VERR_IOM_INVALID_MMIO_RANGE; 1438 1413 } 1439 1440 AssertReturn(enmCtx == IOMMMIOCTX_GLOBAL || (unsigned)enmCtx < pVM->cCPUs, VERR_INVALID_PARAMETER);1441 1414 1442 1415 /* … … 1455 1428 */ 1456 1429 PIOMMMIORANGE pRange; 1457 if ( enmCtx == IOMMMIOCTX_CPU0 1458 || enmCtx == IOMMMIOCTX_GLOBAL) 1459 { 1460 unsigned cb = enmCtx == IOMMMIOCTX_GLOBAL 1461 ? RT_OFFSETOF(IOMMMIORANGE, a[pVM->cCPUs]) 1462 : RT_OFFSETOF(IOMMMIORANGE, a[1]); 1463 rc = MMHyperAlloc(pVM, cb, 0, MM_TAG_IOM, (void **)&pRange); 1464 if (VBOX_SUCCESS(rc)) 1430 rc = MMHyperAlloc(pVM, sizeof(*pRange), 0, MM_TAG_IOM, (void **)&pRange); 1431 if (VBOX_SUCCESS(rc)) 1432 { 1433 pRange->Core.Key = GCPhysStart; 1434 pRange->Core.KeyLast = GCPhysStart + (cbRange - 1); 1435 pRange->GCPhys = GCPhysStart; 1436 pRange->cb = cbRange; 1437 pRange->pszDesc = pszDesc; 1438 1439 pRange->pvUserR3 = pvUser; 1440 pRange->pDevInsR3 = pDevIns; 1441 pRange->pfnReadCallbackR3 = pfnReadCallback; 1442 pRange->pfnWriteCallbackR3 = pfnWriteCallback; 1443 pRange->pfnFillCallbackR3 = pfnFillCallback; 1444 1445 //pRange->pvUserR0 = NIL_RTR0PTR; 1446 //pRange->pDevInsR0 = NIL_RTR0PTR; 1447 //pRange->pfnReadCallbackR0 = NIL_RTR0PTR; 1448 //pRange->pfnWriteCallbackR0 = NIL_RTR0PTR; 1449 //pRange->pfnFillCallbackR0 = NIL_RTR0PTR; 1450 1451 //pRange->pvUserGC = NIL_RTGCPTR; 1452 //pRange->pDevInsGC = NIL_RTGCPTR; 1453 //pRange->pfnReadCallbackGC = NIL_RTGCPTR; 1454 //pRange->pfnWriteCallbackGC = NIL_RTGCPTR; 1455 //pRange->pfnFillCallbackGC = NIL_RTGCPTR; 1456 1457 /* 1458 * Try register it with PGM and then insert it into the tree. 1459 */ 1460 rc = PGMR3PhysMMIORegister(pVM, GCPhysStart, cbRange, 1461 IOMR3MMIOHandler, pRange, 1462 pVM->iom.s.pfnMMIOHandlerR0, MMHyperR3ToR0(pVM, pRange), 1463 pVM->iom.s.pfnMMIOHandlerGC, MMHyperR3ToRC(pVM, pRange), pszDesc); 1464 if (RT_SUCCESS(rc)) 1465 1465 { 1466 pRange->Core.Key = GCPhysStart; 1467 pRange->Core.KeyLast = GCPhysStart + (cbRange - 1); 1468 pRange->GCPhys = GCPhysStart; 1469 pRange->cb = cbRange; 1470 pRange->pszDesc = pszDesc; 1471 pRange->enmCtx = enmCtx; 1472 1473 pRange->a[0].pvUserR3 = pvUser; 1474 pRange->a[0].pDevInsR3 = pDevIns; 1475 pRange->pfnReadCallbackR3 = pfnReadCallback; 1476 pRange->pfnWriteCallbackR3 = pfnWriteCallback; 1477 pRange->pfnFillCallbackR3 = pfnFillCallback; 1478 1479 //pRange->a[0].pvUserR0 = NIL_RTR0PTR; 1480 //pRange->a[0].pDevInsR0 = NIL_RTR0PTR; 1481 //pRange->pfnReadCallbackR0 = NIL_RTR0PTR; 1482 //pRange->pfnWriteCallbackR0 = NIL_RTR0PTR; 1483 //pRange->pfnFillCallbackR0 = NIL_RTR0PTR; 1484 1485 //pRange->a[0].pvUserGC = NIL_RTGCPTR; 1486 //pRange->a[0].pDevInsGC = NIL_RTGCPTR; 1487 //pRange->pfnReadCallbackGC = NIL_RTGCPTR; 1488 //pRange->pfnWriteCallbackGC = NIL_RTGCPTR; 1489 //pRange->pfnFillCallbackGC = NIL_RTGCPTR; 1490 1491 /* 1492 * Try register it with PGM and then insert it into the tree. 1493 */ 1494 rc = PGMR3PhysMMIORegister(pVM, GCPhysStart, cbRange, 1495 IOMR3MMIOHandler, pRange, 1496 pVM->iom.s.pfnMMIOHandlerR0, MMHyperR3ToR0(pVM, pRange), 1497 pVM->iom.s.pfnMMIOHandlerGC, MMHyperR3ToRC(pVM, pRange), pszDesc); 1498 if (RT_SUCCESS(rc)) 1499 { 1500 if (RTAvlroGCPhysInsert(&pVM->iom.s.pTreesHC->MMIOTree, &pRange->Core)) 1501 return VINF_SUCCESS; 1502 1503 DBGFR3Info(pVM, "mmio", NULL, NULL); 1504 AssertMsgFailed(("This cannot happen!\n")); 1505 rc = VERR_INTERNAL_ERROR; 1506 } 1507 MMHyperFree(pVM, pRange); 1466 if (RTAvlroGCPhysInsert(&pVM->iom.s.pTreesHC->MMIOTree, &pRange->Core)) 1467 return VINF_SUCCESS; 1468 1469 DBGFR3Info(pVM, "mmio", NULL, NULL); 1470 AssertMsgFailed(("This cannot happen!\n")); 1471 rc = VERR_INTERNAL_ERROR; 1508 1472 } 1509 } 1510 else 1511 { 1512 /* 1513 * Local MMIO registration for CPU > 0. 1514 */ 1515 /** @todo SMP - this is incomplete and won't work. */ 1516 pRange = iomMMIOGetRange(&pVM->iom.s, GCPhysStart); 1517 if (!pRange) 1518 { 1519 /* allocate new range like above... */ 1520 AssertReturn(pRange, VERR_IOM_MMIO_RANGE_NOT_FOUND); 1521 } 1522 else 1523 { 1524 /* add ourselves to the range we found *if* the handlers and stuff matches. */ 1525 AssertReturn(pRange->GCPhys == GCPhysStart, VERR_IOM_INVALID_MMIO_RANGE); 1526 AssertReturn(pRange->cb == cbRange, VERR_IOM_INVALID_MMIO_RANGE); 1527 AssertReturn(pRange->enmCtx == IOMMMIOCTX_CPU0, VERR_IOM_INVALID_MMIO_RANGE); 1528 1529 pRange->a[enmCtx].pvUserR3 = pvUser; 1530 pRange->a[enmCtx].pDevInsR3 = pDevIns; 1531 } 1532 1533 rc = VINF_SUCCESS; 1473 MMHyperFree(pVM, pRange); 1534 1474 } 1535 1475 … … 1549 1489 * @param pVM VM handle. 1550 1490 * @param pDevIns PDM device instance owning the MMIO range. 1551 * @param enmCtx CPU id or IOMMMIOCTX_GLOBAL if it's a global registration (applies to all CPUs)1552 1491 * @param GCPhysStart First physical address in the range. 1553 1492 * @param cbRange The size of the range (in bytes). … … 1557 1496 * @param pfnFillCallback Pointer to function which is gonna handle Fill/memset operations. 1558 1497 */ 1559 IOMR3DECL(int) IOMR3MMIORegisterGC(PVM pVM, PPDMDEVINS pDevIns, IOMMMIOCTX enmCtx,RTGCPHYS GCPhysStart, RTUINT cbRange, RTGCPTR pvUser,1498 IOMR3DECL(int) IOMR3MMIORegisterGC(PVM pVM, PPDMDEVINS pDevIns, RTGCPHYS GCPhysStart, RTUINT cbRange, RTGCPTR pvUser, 1560 1499 RCPTRTYPE(PFNIOMMMIOWRITE) pfnWriteCallback, RCPTRTYPE(PFNIOMMMIOREAD) pfnReadCallback, 1561 1500 RCPTRTYPE(PFNIOMMMIOFILL) pfnFillCallback) 1562 1501 { 1563 LogFlow(("IOMR3MMIORegisterGC: pDevIns=%p CPU=%dGCPhysStart=%VGp cbRange=%#x pvUser=%VGv pfnWriteCallback=%#x pfnReadCallback=%#x pfnFillCallback=%#x\n",1564 pDevIns, enmCtx,GCPhysStart, cbRange, pvUser, pfnWriteCallback, pfnReadCallback, pfnFillCallback));1502 LogFlow(("IOMR3MMIORegisterGC: pDevIns=%p GCPhysStart=%VGp cbRange=%#x pvUser=%VGv pfnWriteCallback=%#x pfnReadCallback=%#x pfnFillCallback=%#x\n", 1503 pDevIns, GCPhysStart, cbRange, pvUser, pfnWriteCallback, pfnReadCallback, pfnFillCallback)); 1565 1504 1566 1505 /* … … 1573 1512 } 1574 1513 1575 AssertReturn(enmCtx == IOMMMIOCTX_GLOBAL || (unsigned)enmCtx < pVM->cCPUs, VERR_INVALID_PARAMETER);1576 1577 1514 /* 1578 1515 * Find the MMIO range and check that the input matches. … … 1580 1517 PIOMMMIORANGE pRange = iomMMIOGetRange(&pVM->iom.s, GCPhysStart); 1581 1518 AssertReturn(pRange, VERR_IOM_MMIO_RANGE_NOT_FOUND); 1582 AssertReturn( enmCtx != IOMMMIOCTX_GLOBAL || pRange->a[0].pDevInsR3 == pDevIns, VERR_IOM_NOT_MMIO_RANGE_OWNER);1519 AssertReturn(pRange->pDevInsR3 == pDevIns, VERR_IOM_NOT_MMIO_RANGE_OWNER); 1583 1520 AssertReturn(pRange->GCPhys == GCPhysStart, VERR_IOM_INVALID_MMIO_RANGE); 1584 1521 AssertReturn(pRange->cb == cbRange, VERR_IOM_INVALID_MMIO_RANGE); 1585 AssertReturn(pRange->enmCtx == IOMMMIOCTX_CPU0 || pRange->enmCtx == IOMMMIOCTX_GLOBAL, VERR_IOM_INVALID_MMIO_RANGE); 1586 1587 if (enmCtx == IOMMMIOCTX_GLOBAL) 1588 enmCtx = IOMMMIOCTX_CPU0; 1589 1590 pRange->a[enmCtx].pvUserGC = pvUser; 1591 pRange->pfnReadCallbackGC = pfnReadCallback; 1592 pRange->pfnWriteCallbackGC = pfnWriteCallback; 1593 pRange->pfnFillCallbackGC = pfnFillCallback; 1594 pRange->a[enmCtx].pDevInsGC = MMHyperCCToRC(pVM, pDevIns); 1522 1523 pRange->pvUserGC = pvUser; 1524 pRange->pfnReadCallbackGC = pfnReadCallback; 1525 pRange->pfnWriteCallbackGC= pfnWriteCallback; 1526 pRange->pfnFillCallbackGC = pfnFillCallback; 1527 pRange->pDevInsGC = MMHyperCCToRC(pVM, pDevIns); 1595 1528 1596 1529 return VINF_SUCCESS; … … 1609 1542 * @param pVM VM handle. 1610 1543 * @param pDevIns PDM device instance owning the MMIO range. 1611 * @param enmCtx CPU id or IOMMMIOCTX_GLOBAL if it's a global registration (applies to all CPUs)1612 1544 * @param GCPhysStart First physical address in the range. 1613 1545 * @param cbRange The size of the range (in bytes). … … 1617 1549 * @param pfnFillCallback Pointer to function which is gonna handle Fill/memset operations. 1618 1550 */ 1619 IOMR3DECL(int) IOMR3MMIORegisterR0(PVM pVM, PPDMDEVINS pDevIns, IOMMMIOCTX enmCtx,RTGCPHYS GCPhysStart, RTUINT cbRange, RTR0PTR pvUser,1551 IOMR3DECL(int) IOMR3MMIORegisterR0(PVM pVM, PPDMDEVINS pDevIns, RTGCPHYS GCPhysStart, RTUINT cbRange, RTR0PTR pvUser, 1620 1552 R0PTRTYPE(PFNIOMMMIOWRITE) pfnWriteCallback, 1621 1553 R0PTRTYPE(PFNIOMMMIOREAD) pfnReadCallback, 1622 1554 R0PTRTYPE(PFNIOMMMIOFILL) pfnFillCallback) 1623 1555 { 1624 LogFlow(("IOMR3MMIORegisterR0: pDevIns=%p CPU=%dGCPhysStart=%VGp cbRange=%#x pvUser=%VHv pfnWriteCallback=%#x pfnReadCallback=%#x pfnFillCallback=%#x\n",1625 pDevIns, enmCtx,GCPhysStart, cbRange, pvUser, pfnWriteCallback, pfnReadCallback, pfnFillCallback));1556 LogFlow(("IOMR3MMIORegisterR0: pDevIns=%p GCPhysStart=%VGp cbRange=%#x pvUser=%VHv pfnWriteCallback=%#x pfnReadCallback=%#x pfnFillCallback=%#x\n", 1557 pDevIns, GCPhysStart, cbRange, pvUser, pfnWriteCallback, pfnReadCallback, pfnFillCallback)); 1626 1558 1627 1559 /* … … 1634 1566 } 1635 1567 1636 AssertReturn(enmCtx == IOMMMIOCTX_GLOBAL || (unsigned)enmCtx < pVM->cCPUs, VERR_INVALID_PARAMETER);1637 1638 1568 /* 1639 1569 * Find the MMIO range and check that the input matches. … … 1641 1571 PIOMMMIORANGE pRange = iomMMIOGetRange(&pVM->iom.s, GCPhysStart); 1642 1572 AssertReturn(pRange, VERR_IOM_MMIO_RANGE_NOT_FOUND); 1643 AssertReturn( enmCtx != IOMMMIOCTX_GLOBAL || pRange->a[0].pDevInsR3 == pDevIns, VERR_IOM_NOT_MMIO_RANGE_OWNER);1573 AssertReturn(pRange->pDevInsR3 == pDevIns, VERR_IOM_NOT_MMIO_RANGE_OWNER); 1644 1574 AssertReturn(pRange->GCPhys == GCPhysStart, VERR_IOM_INVALID_MMIO_RANGE); 1645 1575 AssertReturn(pRange->cb == cbRange, VERR_IOM_INVALID_MMIO_RANGE); 1646 AssertReturn(pRange->enmCtx == IOMMMIOCTX_CPU0 || pRange->enmCtx == IOMMMIOCTX_GLOBAL, VERR_IOM_INVALID_MMIO_RANGE); 1647 1648 if (enmCtx == IOMMMIOCTX_GLOBAL) 1649 enmCtx = IOMMMIOCTX_CPU0; 1650 1651 pRange->a[enmCtx].pvUserR0 = pvUser; 1652 pRange->pfnReadCallbackR0 = pfnReadCallback; 1653 pRange->pfnWriteCallbackR0 = pfnWriteCallback; 1654 pRange->pfnFillCallbackR0 = pfnFillCallback; 1655 pRange->a[enmCtx].pDevInsR0 = MMHyperCCToR0(pVM, pDevIns); 1576 1577 pRange->pvUserR0 = pvUser; 1578 pRange->pfnReadCallbackR0 = pfnReadCallback; 1579 pRange->pfnWriteCallbackR0= pfnWriteCallback; 1580 pRange->pfnFillCallbackR0 = pfnFillCallback; 1581 pRange->pDevInsR0 = MMHyperCCToR0(pVM, pDevIns); 1656 1582 1657 1583 return VINF_SUCCESS; … … 1668 1594 * @param pVM The virtual machine. 1669 1595 * @param pDevIns Device instance which the MMIO region is registered. 1670 * @param enmCtx CPU id or IOMMMIOCTX_GLOBAL if it's a global registration (applies to all CPUs)1671 1596 * @param GCPhysStart First physical address (GC) in the range. 1672 1597 * @param cbRange Number of bytes to deregister. … … 1675 1600 * all the checks you might expect it to do. 1676 1601 */ 1677 IOMR3DECL(int) IOMR3MMIODeregister(PVM pVM, PPDMDEVINS pDevIns, IOMMMIOCTX enmCtx,RTGCPHYS GCPhysStart, RTUINT cbRange)1678 { 1679 LogFlow(("IOMR3MMIODeregister: pDevIns=%p CPU=%d GCPhysStart=%VGp cbRange=%#x\n", pDevIns, enmCtx, GCPhysStart, cbRange));1602 IOMR3DECL(int) IOMR3MMIODeregister(PVM pVM, PPDMDEVINS pDevIns, RTGCPHYS GCPhysStart, RTUINT cbRange) 1603 { 1604 LogFlow(("IOMR3MMIODeregister: pDevIns=%p GCPhysStart=%VGp cbRange=%#x\n", pDevIns, GCPhysStart, cbRange)); 1680 1605 1681 1606 /* … … 1688 1613 return VERR_IOM_INVALID_MMIO_RANGE; 1689 1614 } 1690 1691 /** @todo SMP. */1692 /* Ignore local registrations. This assumes all instances will get unregistered! */1693 if ( enmCtx != IOMMMIOCTX_GLOBAL1694 && enmCtx != IOMMMIOCTX_CPU0)1695 return VINF_SUCCESS;1696 1615 1697 1616 /* … … 1704 1623 if (!pRange) 1705 1624 return VERR_IOM_MMIO_RANGE_NOT_FOUND; 1706 AssertMsgReturn(pRange-> a[0].pDevInsR3 == pDevIns,1625 AssertMsgReturn(pRange->pDevInsR3 == pDevIns, 1707 1626 ("Not owner! GCPhys=%VGp %VGp LB%#x %s\n", GCPhys, GCPhysStart, cbRange, pRange->pszDesc), 1708 1627 VERR_IOM_NOT_MMIO_RANGE_OWNER); … … 1755 1674 pRange->Core.Key, 1756 1675 pRange->Core.KeyLast, 1757 pRange-> a[0].pDevInsR3,1676 pRange->pDevInsR3, 1758 1677 pRange->pfnReadCallbackR3, 1759 1678 pRange->pfnWriteCallbackR3, 1760 1679 pRange->pfnFillCallbackR3, 1761 pRange-> a[0].pvUserR3,1680 pRange->pvUserR3, 1762 1681 pRange->pszDesc); 1763 1682 pHlp->pfnPrintf(pHlp, 1764 1683 "%*s %VHv %VHv %VHv %VHv %VHv\n", 1765 1684 sizeof(RTGCPHYS) * 2 * 2 + 1, "R0", 1766 pRange-> a[0].pDevInsR0,1685 pRange->pDevInsR0, 1767 1686 pRange->pfnReadCallbackR0, 1768 1687 pRange->pfnWriteCallbackR0, 1769 1688 pRange->pfnFillCallbackR0, 1770 pRange-> a[0].pvUserR0);1689 pRange->pvUserR0); 1771 1690 pHlp->pfnPrintf(pHlp, 1772 1691 "%*s %VRv %VRv %VRv %VRv %VRv\n", 1773 1692 sizeof(RTGCPHYS) * 2 * 2 + 1, "GC", 1774 pRange-> a[0].pDevInsGC,1693 pRange->pDevInsGC, 1775 1694 pRange->pfnReadCallbackGC, 1776 1695 pRange->pfnWriteCallbackGC, 1777 1696 pRange->pfnFillCallbackGC, 1778 pRange-> a[0].pvUserGC);1697 pRange->pvUserGC); 1779 1698 return 0; 1780 1699 } -
trunk/src/VBox/VMM/IOMInternal.h
r12561 r12566 53 53 /** Size of the range. */ 54 54 uint32_t cb; 55 /** MMIO registration context. 56 * Used as a boolean with the values IOMMMIOCTX_GLOBAL or !IOMMMIOCTX_GLOBAL 57 * for determing which entry in IOMMMIORANGE::a to access. */ 58 IOMMMIOCTX enmCtx; 59 55 uint32_t u32Alignment; /**< Alignment padding. */ 56 57 /** Pointer to user argument. */ 58 RTR3PTR pvUserR3; 59 /** Pointer to device instance. */ 60 PPDMDEVINSR3 pDevInsR3; 60 61 /** Pointer to write callback function. */ 61 62 R3PTRTYPE(PFNIOMMMIOWRITE) pfnWriteCallbackR3; … … 65 66 R3PTRTYPE(PFNIOMMMIOFILL) pfnFillCallbackR3; 66 67 68 /** Pointer to user argument. */ 69 RTR0PTR pvUserR0; 70 /** Pointer to device instance. */ 71 PPDMDEVINSR0 pDevInsR0; 67 72 /** Pointer to write callback function. */ 68 73 R0PTRTYPE(PFNIOMMMIOWRITE) pfnWriteCallbackR0; … … 72 77 R0PTRTYPE(PFNIOMMMIOFILL) pfnFillCallbackR0; 73 78 79 /** Pointer to user argument. */ 80 RCPTRTYPE(void *) pvUserGC; 81 /** Pointer to device instance. */ 82 PPDMDEVINSRC pDevInsGC; 74 83 /** Pointer to write callback function. */ 75 84 RCPTRTYPE(PFNIOMMMIOWRITE) pfnWriteCallbackGC; … … 83 92 /** Description / Name. For easing debugging. */ 84 93 R3PTRTYPE(const char *) pszDesc; 85 86 /** Array of per CPU context data.87 * When enmCtx is IOMMMIOCTX_GLOBAL the first entry will be used.88 * When enmCtx is not IOMMMIOCTX_GLOBAL entries will be allocated for all CPUs89 * and the range will be reference counted.90 * @todo reference counting the range in directly or indirectly (document it91 * here).92 */93 struct IOMMMIORANGECTX94 {95 /** Pointer to user argument. */96 RTR3PTR pvUserR3;97 /** Pointer to device instance. */98 PPDMDEVINSR3 pDevInsR3;99 /** Pointer to user argument. */100 RTR0PTR pvUserR0;101 /** Pointer to device instance. */102 PPDMDEVINSR0 pDevInsR0;103 /** Pointer to user argument. */104 RCPTRTYPE(void *) pvUserGC;105 /** Pointer to device instance. */106 PPDMDEVINSRC pDevInsGC;107 } a[1];108 94 } IOMMMIORANGE; 109 95 /** Pointer to a MMIO range descriptor, R3 version. */ -
trunk/src/VBox/VMM/PDMDevice.cpp
r12561 r12566 90 90 static DECLCALLBACK(int) pdmR3DevHlp_IOPortRegisterR0(PPDMDEVINS pDevIns, RTIOPORT Port, RTUINT cPorts, RTR0PTR pvUser, const char *pszOut, const char *pszIn, const char *pszOutStr, const char *pszInStr, const char *pszDesc); 91 91 static DECLCALLBACK(int) pdmR3DevHlp_IOPortDeregister(PPDMDEVINS pDevIns, RTIOPORT Port, RTUINT cPorts); 92 static DECLCALLBACK(int) pdmR3DevHlp_MMIORegister(PPDMDEVINS pDevIns, IOMMMIOCTX enmCtx,RTGCPHYS GCPhysStart, RTUINT cbRange, RTHCPTR pvUser,92 static DECLCALLBACK(int) pdmR3DevHlp_MMIORegister(PPDMDEVINS pDevIns, RTGCPHYS GCPhysStart, RTUINT cbRange, RTHCPTR pvUser, 93 93 PFNIOMMMIOWRITE pfnWrite, PFNIOMMMIOREAD pfnRead, PFNIOMMMIOFILL pfnFill, 94 94 const char *pszDesc); 95 static DECLCALLBACK(int) pdmR3DevHlp_MMIORegisterGC(PPDMDEVINS pDevIns, IOMMMIOCTX enmCtx,RTGCPHYS GCPhysStart, RTUINT cbRange, RTGCPTR pvUser,95 static DECLCALLBACK(int) pdmR3DevHlp_MMIORegisterGC(PPDMDEVINS pDevIns, RTGCPHYS GCPhysStart, RTUINT cbRange, RTGCPTR pvUser, 96 96 const char *pszWrite, const char *pszRead, const char *pszFill, 97 97 const char *pszDesc); 98 static DECLCALLBACK(int) pdmR3DevHlp_MMIORegisterR0(PPDMDEVINS pDevIns, IOMMMIOCTX enmCtx,RTGCPHYS GCPhysStart, RTUINT cbRange, RTR0PTR pvUser,98 static DECLCALLBACK(int) pdmR3DevHlp_MMIORegisterR0(PPDMDEVINS pDevIns, RTGCPHYS GCPhysStart, RTUINT cbRange, RTR0PTR pvUser, 99 99 const char *pszWrite, const char *pszRead, const char *pszFill, 100 100 const char *pszDesc); 101 static DECLCALLBACK(int) pdmR3DevHlp_MMIODeregister(PPDMDEVINS pDevIns, IOMMMIOCTX enmCtx,RTGCPHYS GCPhysStart, RTUINT cbRange);101 static DECLCALLBACK(int) pdmR3DevHlp_MMIODeregister(PPDMDEVINS pDevIns, RTGCPHYS GCPhysStart, RTUINT cbRange); 102 102 static DECLCALLBACK(int) pdmR3DevHlp_ROMRegister(PPDMDEVINS pDevIns, RTGCPHYS GCPhysStart, RTUINT cbRange, const void *pvBinary, bool fShadow, const char *pszDesc); 103 103 static DECLCALLBACK(int) pdmR3DevHlp_SSMRegister(PPDMDEVINS pDevIns, const char *pszName, uint32_t u32Instance, uint32_t u32Version, size_t cbGuess, … … 1356 1356 1357 1357 /** @copydoc PDMDEVHLP::pfnMMIORegister */ 1358 static DECLCALLBACK(int) pdmR3DevHlp_MMIORegister(PPDMDEVINS pDevIns, IOMMMIOCTX enmCtx,RTGCPHYS GCPhysStart, RTUINT cbRange, RTHCPTR pvUser,1358 static DECLCALLBACK(int) pdmR3DevHlp_MMIORegister(PPDMDEVINS pDevIns, RTGCPHYS GCPhysStart, RTUINT cbRange, RTHCPTR pvUser, 1359 1359 PFNIOMMMIOWRITE pfnWrite, PFNIOMMMIOREAD pfnRead, PFNIOMMMIOFILL pfnFill, 1360 1360 const char *pszDesc) … … 1362 1362 PDMDEV_ASSERT_DEVINS(pDevIns); 1363 1363 VM_ASSERT_EMT(pDevIns->Internal.s.pVMHC); 1364 LogFlow(("pdmR3DevHlp_MMIORegister: caller='%s'/%d: CPU=%dGCPhysStart=%VGp cbRange=%#x pvUser=%p pfnWrite=%p pfnRead=%p pfnFill=%p pszDesc=%p:{%s}\n",1365 pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, enmCtx,GCPhysStart, cbRange, pvUser, pfnWrite, pfnRead, pfnFill, pszDesc, pszDesc));1366 1367 int rc = IOMR3MMIORegisterR3(pDevIns->Internal.s.pVMHC, pDevIns, enmCtx,GCPhysStart, cbRange, pvUser, pfnWrite, pfnRead, pfnFill, pszDesc);1364 LogFlow(("pdmR3DevHlp_MMIORegister: caller='%s'/%d: GCPhysStart=%VGp cbRange=%#x pvUser=%p pfnWrite=%p pfnRead=%p pfnFill=%p pszDesc=%p:{%s}\n", 1365 pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, GCPhysStart, cbRange, pvUser, pfnWrite, pfnRead, pfnFill, pszDesc, pszDesc)); 1366 1367 int rc = IOMR3MMIORegisterR3(pDevIns->Internal.s.pVMHC, pDevIns, GCPhysStart, cbRange, pvUser, pfnWrite, pfnRead, pfnFill, pszDesc); 1368 1368 1369 1369 LogFlow(("pdmR3DevHlp_MMIORegister: caller='%s'/%d: returns %Vrc\n", pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, rc)); … … 1373 1373 1374 1374 /** @copydoc PDMDEVHLP::pfnMMIORegisterGC */ 1375 static DECLCALLBACK(int) pdmR3DevHlp_MMIORegisterGC(PPDMDEVINS pDevIns, IOMMMIOCTX enmCtx,RTGCPHYS GCPhysStart, RTUINT cbRange, RTGCPTR pvUser,1375 static DECLCALLBACK(int) pdmR3DevHlp_MMIORegisterGC(PPDMDEVINS pDevIns, RTGCPHYS GCPhysStart, RTUINT cbRange, RTGCPTR pvUser, 1376 1376 const char *pszWrite, const char *pszRead, const char *pszFill, 1377 1377 const char *pszDesc) … … 1379 1379 PDMDEV_ASSERT_DEVINS(pDevIns); 1380 1380 VM_ASSERT_EMT(pDevIns->Internal.s.pVMHC); 1381 LogFlow(("pdmR3DevHlp_MMIORegisterGC: caller='%s'/%d: CPU=%dGCPhysStart=%VGp cbRange=%#x pvUser=%p pszWrite=%p:{%s} pszRead=%p:{%s} pszFill=%p:{%s}\n",1382 pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, enmCtx,GCPhysStart, cbRange, pvUser, pszWrite, pszWrite, pszRead, pszRead, pszFill, pszFill));1381 LogFlow(("pdmR3DevHlp_MMIORegisterGC: caller='%s'/%d: GCPhysStart=%VGp cbRange=%#x pvUser=%p pszWrite=%p:{%s} pszRead=%p:{%s} pszFill=%p:{%s}\n", 1382 pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, GCPhysStart, cbRange, pvUser, pszWrite, pszWrite, pszRead, pszRead, pszFill, pszFill)); 1383 1383 1384 1384 /* … … 1402 1402 rc3 = PDMR3GetSymbolGCLazy(pDevIns->Internal.s.pVMHC, pDevIns->pDevReg->szGCMod, pszFill, &GCPtrFill); 1403 1403 if (VBOX_SUCCESS(rc) && VBOX_SUCCESS(rc2) && VBOX_SUCCESS(rc3)) 1404 rc = IOMR3MMIORegisterGC(pDevIns->Internal.s.pVMHC, pDevIns, enmCtx,GCPhysStart, cbRange, pvUser, GCPtrWrite, GCPtrRead, GCPtrFill);1404 rc = IOMR3MMIORegisterGC(pDevIns->Internal.s.pVMHC, pDevIns, GCPhysStart, cbRange, pvUser, GCPtrWrite, GCPtrRead, GCPtrFill); 1405 1405 else 1406 1406 { … … 1425 1425 1426 1426 /** @copydoc PDMDEVHLP::pfnMMIORegisterR0 */ 1427 static DECLCALLBACK(int) pdmR3DevHlp_MMIORegisterR0(PPDMDEVINS pDevIns, IOMMMIOCTX enmCtx,RTGCPHYS GCPhysStart, RTUINT cbRange, RTR0PTR pvUser,1427 static DECLCALLBACK(int) pdmR3DevHlp_MMIORegisterR0(PPDMDEVINS pDevIns, RTGCPHYS GCPhysStart, RTUINT cbRange, RTR0PTR pvUser, 1428 1428 const char *pszWrite, const char *pszRead, const char *pszFill, 1429 1429 const char *pszDesc) … … 1431 1431 PDMDEV_ASSERT_DEVINS(pDevIns); 1432 1432 VM_ASSERT_EMT(pDevIns->Internal.s.pVMHC); 1433 LogFlow(("pdmR3DevHlp_MMIORegisterHC: caller='%s'/%d: CPU=%dGCPhysStart=%VGp cbRange=%#x pvUser=%p pszWrite=%p:{%s} pszRead=%p:{%s} pszFill=%p:{%s}\n",1434 pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, enmCtx,GCPhysStart, cbRange, pvUser, pszWrite, pszWrite, pszRead, pszRead, pszFill, pszFill));1433 LogFlow(("pdmR3DevHlp_MMIORegisterHC: caller='%s'/%d: GCPhysStart=%VGp cbRange=%#x pvUser=%p pszWrite=%p:{%s} pszRead=%p:{%s} pszFill=%p:{%s}\n", 1434 pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, GCPhysStart, cbRange, pvUser, pszWrite, pszWrite, pszRead, pszRead, pszFill, pszFill)); 1435 1435 1436 1436 /* … … 1454 1454 rc3 = PDMR3GetSymbolR0Lazy(pDevIns->Internal.s.pVMHC, pDevIns->pDevReg->szR0Mod, pszFill, &pfnR0PtrFill); 1455 1455 if (VBOX_SUCCESS(rc) && VBOX_SUCCESS(rc2) && VBOX_SUCCESS(rc3)) 1456 rc = IOMR3MMIORegisterR0(pDevIns->Internal.s.pVMHC, pDevIns, enmCtx,GCPhysStart, cbRange, pvUser, pfnR0PtrWrite, pfnR0PtrRead, pfnR0PtrFill);1456 rc = IOMR3MMIORegisterR0(pDevIns->Internal.s.pVMHC, pDevIns, GCPhysStart, cbRange, pvUser, pfnR0PtrWrite, pfnR0PtrRead, pfnR0PtrFill); 1457 1457 else 1458 1458 { … … 1478 1478 1479 1479 /** @copydoc PDMDEVHLP::pfnMMIODeregister */ 1480 static DECLCALLBACK(int) pdmR3DevHlp_MMIODeregister(PPDMDEVINS pDevIns, IOMMMIOCTX enmCtx,RTGCPHYS GCPhysStart, RTUINT cbRange)1480 static DECLCALLBACK(int) pdmR3DevHlp_MMIODeregister(PPDMDEVINS pDevIns, RTGCPHYS GCPhysStart, RTUINT cbRange) 1481 1481 { 1482 1482 PDMDEV_ASSERT_DEVINS(pDevIns); 1483 1483 VM_ASSERT_EMT(pDevIns->Internal.s.pVMHC); 1484 LogFlow(("pdmR3DevHlp_MMIODeregister: caller='%s'/%d: CPU=%dGCPhysStart=%VGp cbRange=%#x\n",1485 pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, enmCtx,GCPhysStart, cbRange));1486 1487 int rc = IOMR3MMIODeregister(pDevIns->Internal.s.pVMHC, pDevIns, enmCtx,GCPhysStart, cbRange);1484 LogFlow(("pdmR3DevHlp_MMIODeregister: caller='%s'/%d: GCPhysStart=%VGp cbRange=%#x\n", 1485 pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, GCPhysStart, cbRange)); 1486 1487 int rc = IOMR3MMIODeregister(pDevIns->Internal.s.pVMHC, pDevIns, GCPhysStart, cbRange); 1488 1488 1489 1489 LogFlow(("pdmR3DevHlp_MMIODeregister: caller='%s'/%d: returns %Vrc\n", pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, rc)); … … 2724 2724 2725 2725 /* 2726 * Only one APIC device registration allowed. (even in the MP case)2726 * Only one APIC device. (malc: only in UP case actually) 2727 2727 */ 2728 2728 PVM pVM = pDevIns->Internal.s.pVMHC; -
trunk/src/VBox/VMM/VMMAll/IOMAllMMIO.cpp
r12561 r12566 84 84 #endif 85 85 86 unsigned idCPU = (pRange->enmCtx == IOMMMIOCTX_GLOBAL) ? 0 : pVM->idCPU;87 Assert(pRange->a[idCPU].CTXALLSUFF(pDevIns)); /** @todo SMP */88 89 86 int rc; 90 87 if (RT_LIKELY(pRange->CTXALLSUFF(pfnWriteCallback))) 91 rc = pRange->CTXALLSUFF(pfnWriteCallback)(pRange-> a[idCPU].CTXALLSUFF(pDevIns), pRange->a[idCPU].CTXALLSUFF(pvUser), GCPhysFault, (void *)pvData, cb); /* @todo fix const!! */88 rc = pRange->CTXALLSUFF(pfnWriteCallback)(pRange->CTXALLSUFF(pDevIns), pRange->CTXALLSUFF(pvUser), GCPhysFault, (void *)pvData, cb); /* @todo fix const!! */ 92 89 else 93 90 rc = VINF_SUCCESS; … … 107 104 #endif 108 105 109 unsigned idCPU = (pRange->enmCtx == IOMMMIOCTX_GLOBAL) ? 0 : pVM->idCPU;110 Assert(pRange->a[idCPU].CTXALLSUFF(pDevIns)); /** @todo SMP */111 112 106 int rc; 113 107 if (RT_LIKELY(pRange->CTXALLSUFF(pfnReadCallback))) 114 rc = pRange->CTXALLSUFF(pfnReadCallback)(pRange-> a[idCPU].CTXALLSUFF(pDevIns), pRange->a[idCPU].CTXALLSUFF(pvUser), GCPhysFault, pvData, cb);108 rc = pRange->CTXALLSUFF(pfnReadCallback)(pRange->CTXALLSUFF(pDevIns), pRange->CTXALLSUFF(pvUser), GCPhysFault, pvData, cb); 115 109 else 116 110 { … … 589 583 if (pRange->CTXALLSUFF(pfnFillCallback)) 590 584 { 591 unsigned idCPU = (pRange->enmCtx == IOMMMIOCTX_GLOBAL) ? 0 : pVM->idCPU;592 Assert(pRange->a[idCPU].CTXALLSUFF(pDevIns)); /** @todo SMP */593 594 585 /* 595 586 * Use the fill callback. … … 599 590 { 600 591 /* addr++ variant. */ 601 rc = pRange->CTXALLSUFF(pfnFillCallback)(pRange-> a[idCPU].CTXALLSUFF(pDevIns), pRange->a[idCPU].CTXALLSUFF(pvUser), Phys, u32Data, cb, cTransfers);592 rc = pRange->CTXALLSUFF(pfnFillCallback)(pRange->CTXALLSUFF(pDevIns), pRange->CTXALLSUFF(pvUser), Phys, u32Data, cb, cTransfers); 602 593 if (rc == VINF_SUCCESS) 603 594 { … … 611 602 { 612 603 /* addr-- variant. */ 613 rc = pRange->CTXALLSUFF(pfnFillCallback)(pRange-> a[idCPU].CTXALLSUFF(pDevIns), pRange->a[idCPU].CTXALLSUFF(pvUser), (Phys - (cTransfers - 1)) << SIZE_2_SHIFT(cb), u32Data, cb, cTransfers);604 rc = pRange->CTXALLSUFF(pfnFillCallback)(pRange->CTXALLSUFF(pDevIns), pRange->CTXALLSUFF(pvUser), (Phys - (cTransfers - 1)) << SIZE_2_SHIFT(cb), u32Data, cb, cTransfers); 614 605 if (rc == VINF_SUCCESS) 615 606 { … … 1277 1268 * Perform the read and deal with the result. 1278 1269 */ 1279 unsigned idCPU = (pRange->enmCtx == IOMMMIOCTX_GLOBAL) ? 0 : pVM->idCPU;1280 Assert(pRange->a[idCPU].CTXALLSUFF(pDevIns)); /** @todo SMP */1281 1282 1270 #ifdef VBOX_WITH_STATISTICS 1283 1271 if (pStats) 1284 1272 STAM_PROFILE_ADV_START(&pStats->CTXALLSUFF(ProfRead), a); 1285 1273 #endif 1286 int rc = pRange->CTXALLSUFF(pfnReadCallback)(pRange-> a[idCPU].CTXALLSUFF(pDevIns), pRange->a[idCPU].CTXALLSUFF(pvUser), GCPhys, pu32Value, cbValue);1274 int rc = pRange->CTXALLSUFF(pfnReadCallback)(pRange->CTXALLSUFF(pDevIns), pRange->CTXALLSUFF(pvUser), GCPhys, pu32Value, cbValue); 1287 1275 #ifdef VBOX_WITH_STATISTICS 1288 1276 if (pStats) … … 1387 1375 if (pRange->CTXALLSUFF(pfnWriteCallback)) 1388 1376 { 1389 unsigned idCPU = (pRange->enmCtx == IOMMMIOCTX_GLOBAL) ? 0 : pVM->idCPU;1390 Assert(pRange->a[idCPU].CTXALLSUFF(pDevIns)); /** @todo SMP */1391 1392 1377 #ifdef VBOX_WITH_STATISTICS 1393 1378 if (pStats) 1394 1379 STAM_PROFILE_ADV_START(&pStats->CTXALLSUFF(ProfWrite), a); 1395 1380 #endif 1396 int rc = pRange->CTXALLSUFF(pfnWriteCallback)(pRange-> a[idCPU].CTXALLSUFF(pDevIns), pRange->a[idCPU].CTXALLSUFF(pvUser), GCPhys, &u32Value, cbValue);1381 int rc = pRange->CTXALLSUFF(pfnWriteCallback)(pRange->CTXALLSUFF(pDevIns), pRange->CTXALLSUFF(pvUser), GCPhys, &u32Value, cbValue); 1397 1382 #ifdef VBOX_WITH_STATISTICS 1398 1383 if (pStats) -
trunk/src/VBox/VMM/testcase/tstVMStructGC.cpp
r12561 r12566 139 139 GEN_CHECK_OFF(IOMMMIORANGE, cb); 140 140 GEN_CHECK_OFF(IOMMMIORANGE, pszDesc); 141 GEN_CHECK_OFF(IOMMMIORANGE, a[0].pvUserR3);142 GEN_CHECK_OFF(IOMMMIORANGE, a[0].pDevInsR3);141 GEN_CHECK_OFF(IOMMMIORANGE, pvUserR3); 142 GEN_CHECK_OFF(IOMMMIORANGE, pDevInsR3); 143 143 GEN_CHECK_OFF(IOMMMIORANGE, pfnWriteCallbackR3); 144 144 GEN_CHECK_OFF(IOMMMIORANGE, pfnReadCallbackR3); 145 145 GEN_CHECK_OFF(IOMMMIORANGE, pfnFillCallbackR3); 146 GEN_CHECK_OFF(IOMMMIORANGE, a[0].pvUserR0);147 GEN_CHECK_OFF(IOMMMIORANGE, a[0].pDevInsR0);146 GEN_CHECK_OFF(IOMMMIORANGE, pvUserR0); 147 GEN_CHECK_OFF(IOMMMIORANGE, pDevInsR0); 148 148 GEN_CHECK_OFF(IOMMMIORANGE, pfnWriteCallbackR0); 149 149 GEN_CHECK_OFF(IOMMMIORANGE, pfnReadCallbackR0); 150 150 GEN_CHECK_OFF(IOMMMIORANGE, pfnFillCallbackR0); 151 GEN_CHECK_OFF(IOMMMIORANGE, a[0].pvUserGC);152 GEN_CHECK_OFF(IOMMMIORANGE, a[0].pDevInsGC);151 GEN_CHECK_OFF(IOMMMIORANGE, pvUserGC); 152 GEN_CHECK_OFF(IOMMMIORANGE, pDevInsGC); 153 153 GEN_CHECK_OFF(IOMMMIORANGE, pfnWriteCallbackGC); 154 154 GEN_CHECK_OFF(IOMMMIORANGE, pfnReadCallbackGC);
Note:
See TracChangeset
for help on using the changeset viewer.