Changeset 53708 in vbox
- Timestamp:
- Jan 2, 2015 12:44:30 PM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/ExtPacks/VBoxDTrace/VBoxDTraceR0/VBoxDTraceR0.cpp
r53707 r53708 106 106 /** The user context. */ 107 107 PCSUPDRVTRACERUSRCTX pCtx; 108 /** The argument displacement caused by 64-bit arguments passed directly to 109 * dtrace_probe. */ 110 int offArg; 108 111 } ProbeFireUser; 109 112 } u; … … 153 156 VBoxDtReleaseThread(pStackData->pThread); \ 154 157 } while (0) 158 159 160 /** Simple SUPR0Printf-style logging. */ 161 #if 0 /*def DEBUG_bird*/ 162 # define LOG_DTRACE(a) SUPR0Printf a 163 #else 164 # define LOG_DTRACE(a) do { } while (0) 165 #endif 155 166 156 167 … … 1374 1385 static void vboxDtPOps_Provide(void *pvProv, const dtrace_probedesc_t *pDtProbeDesc) 1375 1386 { 1376 PSUPDRVVDTPROVIDERCORE pProv = (PSUPDRVVDTPROVIDERCORE)pvProv; 1387 PSUPDRVVDTPROVIDERCORE pProv = (PSUPDRVVDTPROVIDERCORE)pvProv; 1388 AssertPtrReturnVoid(pProv); 1389 LOG_DTRACE(("%s: %p / %p pDtProbeDesc=%p\n", __FUNCTION__, pProv, pProv->TracerData.DTrace.idProvider, pDtProbeDesc)); 1377 1390 1378 1391 if (pDtProbeDesc) … … 1382 1395 return; 1383 1396 1384 dtrace_provider_id_t const idProvider = pProv->TracerData.DTrace.idProvider;1397 dtrace_provider_id_t const idProvider = pProv->TracerData.DTrace.idProvider; 1385 1398 AssertPtrReturnVoid(idProvider); 1386 1399 … … 1388 1401 AssertReturnVoid(pProv->pHdr->offProbeLocs != 0); 1389 1402 uint32_t const cProbeLocs = pProv->pHdr->cbProbeLocs / sizeof(VTGPROBELOC); 1390 1391 1403 1392 1404 /* Need a buffer for extracting the function names and mangling them in … … 1407 1419 we've already reported. */ 1408 1420 PCVTGPROBELOC pProbeLocRO = &pProv->paProbeLocsRO[idxProbeLoc]; 1409 PVTGDESCPROBE pProbeDesc = (PVTGDESCPROBE)pProbeLocRO->pbProbe;1421 PVTGDESCPROBE pProbeDesc = pProbeLocRO->pProbe; 1410 1422 if (pProbeDesc->idxProvider != idxProv) 1411 1423 continue; … … 1483 1495 1484 1496 RTMemFree(pszFnNmBuf); 1497 LOG_DTRACE(("%s: returns\n", __FUNCTION__)); 1485 1498 } 1486 1499 … … 1492 1505 { 1493 1506 PSUPDRVVDTPROVIDERCORE pProv = (PSUPDRVVDTPROVIDERCORE)pvProv; 1507 LOG_DTRACE(("%s: %p / %p - %#x / %p\n", __FUNCTION__, pProv, pProv->TracerData.DTrace.idProvider, idProbe, pvProbe)); 1508 AssertPtrReturn(pProv->TracerData.DTrace.idProvider, EINVAL); 1509 1494 1510 if (!pProv->TracerData.DTrace.fZombie) 1495 1511 { … … 1497 1513 PVTGPROBELOC32 pProbeLocEn = (PVTGPROBELOC32)( (uintptr_t)pProv->pvProbeLocsEn + idxProbeLoc * pProv->cbProbeLocsEn); 1498 1514 PCVTGPROBELOC pProbeLocRO = (PVTGPROBELOC)&pProv->paProbeLocsRO[idxProbeLoc]; 1499 PCVTGDESCPROBE pProbeDesc = (PVTGDESCPROBE)pProbeLocRO->pbProbe;1515 PCVTGDESCPROBE pProbeDesc = pProbeLocRO->pProbe; 1500 1516 uint32_t const idxProbe = pProbeDesc->idxEnabled; 1501 1517 … … 1533 1549 { 1534 1550 PSUPDRVVDTPROVIDERCORE pProv = (PSUPDRVVDTPROVIDERCORE)pvProv; 1551 AssertPtrReturnVoid(pProv); 1552 LOG_DTRACE(("%s: %p / %p - %#x / %p\n", __FUNCTION__, pProv, pProv->TracerData.DTrace.idProvider, idProbe, pvProbe)); 1553 AssertPtrReturnVoid(pvProbe); 1554 AssertPtrReturnVoid(pProv->TracerData.DTrace.idProvider); 1555 1535 1556 if (!pProv->TracerData.DTrace.fZombie) 1536 1557 { … … 1538 1559 PVTGPROBELOC32 pProbeLocEn = (PVTGPROBELOC32)( (uintptr_t)pProv->pvProbeLocsEn + idxProbeLoc * pProv->cbProbeLocsEn); 1539 1560 PCVTGPROBELOC pProbeLocRO = (PVTGPROBELOC)&pProv->paProbeLocsRO[idxProbeLoc]; 1540 PCVTGDESCPROBE pProbeDesc = (PVTGDESCPROBE)pProbeLocRO->pbProbe;1561 PCVTGDESCPROBE pProbeDesc = pProbeLocRO->pProbe; 1541 1562 uint32_t const idxProbe = pProbeDesc->idxEnabled; 1542 1563 … … 1570 1591 */ 1571 1592 static void vboxDtPOps_GetArgDesc(void *pvProv, dtrace_id_t idProbe, void *pvProbe, 1572 dtrace_argdesc_t *pArgDesc)1593 dtrace_argdesc_t *pArgDesc) 1573 1594 { 1574 1595 PSUPDRVVDTPROVIDERCORE pProv = (PSUPDRVVDTPROVIDERCORE)pvProv; 1575 1596 unsigned uArg = pArgDesc->dtargd_ndx; 1597 1576 1598 pArgDesc->dtargd_ndx = DTRACE_ARGNONE; 1599 AssertPtrReturnVoid(pProv); 1600 LOG_DTRACE(("%s: %p / %p - %#x / %p uArg=%d\n", __FUNCTION__, pProv, pProv->TracerData.DTrace.idProvider, idProbe, pvProbe, uArg)); 1601 AssertPtrReturnVoid(pvProbe); 1602 AssertPtrReturnVoid(pProv->TracerData.DTrace.idProvider); 1577 1603 1578 1604 if (!pProv->TracerData.DTrace.fZombie) … … 1580 1606 uint32_t idxProbeLoc = (uint32_t)(uintptr_t)pvProbe; 1581 1607 PCVTGPROBELOC pProbeLocRO = (PVTGPROBELOC)&pProv->paProbeLocsRO[idxProbeLoc]; 1582 PCVTGDESCPROBE pProbeDesc = (PVTGDESCPROBE)pProbeLocRO->pbProbe;1608 PCVTGDESCPROBE pProbeDesc = pProbeLocRO->pProbe; 1583 1609 PCVTGDESCARGLIST pArgList = (PCVTGDESCARGLIST)( (uintptr_t)pProv->pHdr 1584 1610 + pProv->pHdr->offArgLists … … 1593 1619 { 1594 1620 memcpy(pArgDesc->dtargd_native, pszType, cchType + 1); 1621 /** @todo mapping? */ 1595 1622 pArgDesc->dtargd_ndx = uArg; 1596 /** @todo mapping? */1623 LOG_DTRACE(("%s: returns dtargd_native = %s\n", __FUNCTION__, pArgDesc->dtargd_native)); 1597 1624 return; 1598 1625 } 1599 1626 } 1600 1627 } 1601 1602 1628 } 1603 1629 … … 1609 1635 int iArg, int cFrames) 1610 1636 { 1611 PVBDTSTACKDATA pData = vboxDtGetStackData(); 1637 PSUPDRVVDTPROVIDERCORE pProv = (PSUPDRVVDTPROVIDERCORE)pvProv; 1638 AssertPtrReturn(pProv, UINT64_MAX); 1639 LOG_DTRACE(("%s: %p / %p - %#x / %p iArg=%d cFrames=%u\n", __FUNCTION__, pProv, pProv->TracerData.DTrace.idProvider, idProbe, pvProbe, iArg, cFrames)); 1612 1640 AssertReturn(iArg >= 5, UINT64_MAX); 1613 1614 if (pData->enmCaller == kVBoxDtCaller_ProbeFireKernel) 1615 return pData->u.ProbeFireKernel.pauStackArgs[iArg - 5]; 1616 1617 if (pData->enmCaller == kVBoxDtCaller_ProbeFireUser) 1618 { 1619 PCSUPDRVTRACERUSRCTX pCtx = pData->u.ProbeFireUser.pCtx; 1641 if (pProv->TracerData.DTrace.fZombie) 1642 return UINT64_MAX; 1643 1644 uint32_t idxProbeLoc = (uint32_t)(uintptr_t)pvProbe; 1645 PCVTGPROBELOC pProbeLocRO = (PVTGPROBELOC)&pProv->paProbeLocsRO[idxProbeLoc]; 1646 PCVTGDESCPROBE pProbeDesc = pProbeLocRO->pProbe; 1647 PCVTGDESCARGLIST pArgList = (PCVTGDESCARGLIST)( (uintptr_t)pProv->pHdr 1648 + pProv->pHdr->offArgLists 1649 + pProbeDesc->offArgList); 1650 AssertReturn(pProbeDesc->offArgList < pProv->pHdr->cbArgLists, UINT64_MAX); 1651 1652 PVBDTSTACKDATA pData = vboxDtGetStackData(); 1653 1654 /* 1655 * Get the stack data. This is a wee bit complicated on 32-bit systems 1656 * since we want to support 64-bit integer arguments. 1657 */ 1658 uint64_t u64Ret; 1659 if (iArg >= 20) 1660 u64Ret = UINT64_MAX; 1661 else if (pData->enmCaller == kVBoxDtCaller_ProbeFireKernel) 1662 { 1663 #if ARCH_BITS == 64 1664 u64Ret = pData->u.ProbeFireKernel.pauStackArgs[iArg - 5]; 1665 #else 1666 if ( !pArgList->fHaveLargeArgs 1667 || iArg >= pArgList->cArgs) 1668 u64Ret = pData->u.ProbeFireKernel.pauStackArgs[iArg - 5]; 1669 else 1670 { 1671 /* Similar to what we did for mac in when calling dtrace_probe(). */ 1672 uint32_t offArg = 0; 1673 for (int i = 5; i < iArg; i++) 1674 if (VTG_TYPE_IS_LARGE(pArgList->aArgs[iArg].fType)) 1675 offArg++; 1676 u64Ret = pData->u.ProbeFireKernel.pauStackArgs[iArg - 5 + offArg]; 1677 if (VTG_TYPE_IS_LARGE(pArgList->aArgs[iArg].fType)) 1678 u64Ret |= (uint64_t)pData->u.ProbeFireKernel.pauStackArgs[iArg - 5 + offArg + 1] << 32; 1679 } 1680 #endif 1681 } 1682 else if (pData->enmCaller == kVBoxDtCaller_ProbeFireUser) 1683 { 1684 int offArg = pData->u.ProbeFireUser.offArg; 1685 PCSUPDRVTRACERUSRCTX pCtx = pData->u.ProbeFireUser.pCtx; 1686 AssertPtrReturn(pCtx, UINT64_MAX); 1687 1620 1688 if (pCtx->cBits == 32) 1621 1689 { 1622 if ((unsigned)iArg < RT_ELEMENTS(pCtx->u.X86.aArgs)) 1623 return pCtx->u.X86.aArgs[iArg]; 1624 } 1625 else if (pCtx->cBits == 64) 1626 { 1627 if ((unsigned)iArg < RT_ELEMENTS(pCtx->u.Amd64.aArgs)) 1628 return pCtx->u.Amd64.aArgs[iArg]; 1690 if ( !pArgList->fHaveLargeArgs 1691 || iArg >= pArgList->cArgs) 1692 { 1693 if (iArg + offArg < (int)RT_ELEMENTS(pCtx->u.X86.aArgs)) 1694 u64Ret = pCtx->u.Amd64.aArgs[iArg + offArg]; 1695 else 1696 u64Ret = UINT64_MAX; 1697 } 1698 else 1699 { 1700 for (int i = 5; i < iArg; i++) 1701 if (VTG_TYPE_IS_LARGE(pArgList->aArgs[iArg].fType)) 1702 offArg++; 1703 if (offArg + iArg < (int)RT_ELEMENTS(pCtx->u.X86.aArgs)) 1704 { 1705 u64Ret = pCtx->u.X86.aArgs[iArg + offArg]; 1706 if ( VTG_TYPE_IS_LARGE(pArgList->aArgs[iArg].fType) 1707 && offArg + iArg + 1 < (int)RT_ELEMENTS(pCtx->u.X86.aArgs)) 1708 u64Ret |= (uint64_t)pCtx->u.X86.aArgs[iArg + offArg + 1] << 32; 1709 } 1710 else 1711 u64Ret = UINT64_MAX; 1712 } 1629 1713 } 1630 1714 else 1631 AssertFailed(); 1632 } 1633 1634 NOREF(pvProbe); 1635 return UINT64_MAX; 1715 { 1716 if (iArg + offArg < (int)RT_ELEMENTS(pCtx->u.Amd64.aArgs)) 1717 u64Ret = pCtx->u.Amd64.aArgs[iArg + offArg]; 1718 else 1719 u64Ret = UINT64_MAX; 1720 } 1721 } 1722 else 1723 AssertFailedReturn(UINT64_MAX); 1724 1725 LOG_DTRACE(("%s: returns %#llx\n", __FUNCTION__, u64Ret)); 1726 return u64Ret; 1636 1727 } 1637 1728 … … 1643 1734 { 1644 1735 PSUPDRVVDTPROVIDERCORE pProv = (PSUPDRVVDTPROVIDERCORE)pvProv; 1736 AssertPtrReturnVoid(pProv); 1737 LOG_DTRACE(("%s: %p / %p - %#x / %p\n", __FUNCTION__, pProv, pProv->TracerData.DTrace.idProvider, idProbe, pvProbe)); 1738 AssertReturnVoid(pProv->TracerData.DTrace.cProvidedProbes > 0); 1739 AssertPtrReturnVoid(pProv->TracerData.DTrace.idProvider); 1740 1645 1741 if (!pProv->TracerData.DTrace.fZombie) 1646 1742 { … … 1700 1796 * interface_method_impl{SUPDRVTRACERREG,pfnProbeFireKernel} 1701 1797 */ 1702 static DECLCALLBACK(void) vbdt_ProbeFireKernel(struct VTGPROBELOC *pVtgProbeLoc, uintptr_t uArg0, uintptr_t uArg1, uintptr_t uArg2, 1703 uintptr_t uArg3, uintptr_t uArg4) 1704 { 1798 static DECLCALLBACK(void) vboxDtTOps_ProbeFireKernel(struct VTGPROBELOC *pVtgProbeLoc, uintptr_t uArg0, uintptr_t uArg1, uintptr_t uArg2, 1799 uintptr_t uArg3, uintptr_t uArg4) 1800 { 1801 AssertPtrReturnVoid(pVtgProbeLoc); 1802 LOG_DTRACE(("%s: %p / %p\n", __FUNCTION__, pVtgProbeLoc, pVtgProbeLoc->idProbe)); 1803 AssertPtrReturnVoid(pVtgProbeLoc->pProbe); 1804 AssertPtrReturnVoid(pVtgProbeLoc->pszFunction); 1805 1705 1806 VBDT_SETUP_STACK_DATA(kVBoxDtCaller_ProbeFireKernel); 1706 1807 1707 pStackData->u.ProbeFireKernel.uCaller = (uintptr_t)ASMReturnAddress(); 1708 pStackData->u.ProbeFireKernel.pauStackArgs = &uArg4 + 1; 1808 pStackData->u.ProbeFireKernel.pauStackArgs = &uArg4 + 1; 1809 1810 #if defined(RT_OS_DARWIN) && ARCH_BITS == 32 1811 /* 1812 * Convert arguments from uintptr_t to uint64_t. 1813 */ 1814 PVTGDESCPROBE pProbe = (PVTGDESCPROBE)((PVTGPROBELOC)pVtgProbeLoc)->pbProbe; 1815 AssertPtrReturnVoid(pProbe); 1816 PVTGOBJHDR pVtgHdr = (PVTGOBJHDR)((uintptr_t)pProbe + pProbe->offObjHdr); 1817 AssertPtrReturnVoid(pVtgHdr); 1818 PVTGDESCARGLIST pArgList = (PVTGDESCARGLIST)((uintptr_t)pVtgHdr + pVtgHdr->offArgLists + pProbe->offArgList); 1819 AssertPtrReturnVoid(pArgList); 1820 if (!pArgList->fHaveLargeArgs) 1821 dtrace_probe(pVtgProbeLoc->idProbe, uArg0, uArg1, uArg2, uArg3, uArg4); 1822 else 1823 { 1824 uintptr_t *auSrcArgs = &uArg0; 1825 uint32_t iSrcArg = 0; 1826 uint32_t iDstArg = 0; 1827 uint64_t au64DstArgs[5]; 1828 1829 while ( iDstArg < RT_ELEMENTS(au64DstArgs) 1830 && iSrcArg < pArgList->cArgs) 1831 { 1832 au64DstArgs[iDstArg] = auSrcArgs[iSrcArg]; 1833 if (VTG_TYPE_IS_LARGE(pArgList->aArgs[iDstArg].fType)) 1834 au64DstArgs[iDstArg] |= (uint64_t)auSrcArgs[++iSrcArg] << 32; 1835 iSrcArg++; 1836 iDstArg++; 1837 } 1838 while (iDstArg < RT_ELEMENTS(au64DstArgs)) 1839 au64DstArgs[iDstArg++] = auSrcArgs[iSrcArg++]; 1840 1841 pStackData->u.ProbeFireK.pauStackArgs = &auSrcArgs[iSrcArg]; 1842 dtrace_probe(pVtgProbeLoc->idProbe, au64DstArgs[0], au64DstArgs[1], au64DstArgs[2], au64DstArgs[3], au64DstArgs[4]); 1843 } 1844 #else 1709 1845 dtrace_probe(pVtgProbeLoc->idProbe, uArg0, uArg1, uArg2, uArg3, uArg4); 1846 #endif 1710 1847 1711 1848 VBDT_CLEAR_STACK_DATA(); 1712 return;1849 LOG_DTRACE(("%s: returns\n", __FUNCTION__)); 1713 1850 } 1714 1851 … … 1717 1854 * interface_method_impl{SUPDRVTRACERREG,pfnProbeFireUser} 1718 1855 */ 1719 static DECLCALLBACK(void) vbdt_ProbeFireUser(PCSUPDRVTRACERREG pThis, PSUPDRVSESSION pSession, PCSUPDRVTRACERUSRCTX pCtx) 1720 { 1856 static DECLCALLBACK(void) vboxDtTOps_ProbeFireUser(PCSUPDRVTRACERREG pThis, PSUPDRVSESSION pSession, PCSUPDRVTRACERUSRCTX pCtx, 1857 PCVTGOBJHDR pVtgHdr, PCVTGPROBELOC pProbeLocRO) 1858 { 1859 LOG_DTRACE(("%s: %p / %p\n", __FUNCTION__, pCtx, pCtx->idProbe)); 1860 AssertPtrReturnVoid(pProbeLocRO); 1861 AssertPtrReturnVoid(pVtgHdr); 1862 1721 1863 VBDT_SETUP_STACK_DATA(kVBoxDtCaller_ProbeFireUser); 1722 1864 1723 pStackData->u.ProbeFireUser.pCtx = pCtx;1724 1865 if (pCtx->cBits == 32) 1866 { 1867 pStackData->u.ProbeFireUser.pCtx = pCtx; 1868 pStackData->u.ProbeFireUser.offArg = 0; 1869 1870 #if ARCH_BITS == 64 || defined(RT_OS_DARWIN) 1871 /* 1872 * Combine two 32-bit arguments into one 64-bit argument where needed. 1873 */ 1874 PVTGDESCPROBE pProbeDesc = pProbeLocRO->pProbe; 1875 AssertPtrReturnVoid(pProbeDesc); 1876 PVTGDESCARGLIST pArgList = (PVTGDESCARGLIST)((uintptr_t)pVtgHdr + pVtgHdr->offArgLists + pProbeDesc->offArgList); 1877 AssertPtrReturnVoid(pArgList); 1878 1879 if (!pArgList->fHaveLargeArgs) 1880 dtrace_probe(pCtx->idProbe, 1881 pCtx->u.X86.aArgs[0], 1882 pCtx->u.X86.aArgs[1], 1883 pCtx->u.X86.aArgs[2], 1884 pCtx->u.X86.aArgs[3], 1885 pCtx->u.X86.aArgs[4]); 1886 else 1887 { 1888 uint32_t const *auSrcArgs = &pCtx->u.X86.aArgs[0]; 1889 uint32_t iSrcArg = 0; 1890 uint32_t iDstArg = 0; 1891 uint64_t au64DstArgs[5]; 1892 1893 while ( iDstArg < RT_ELEMENTS(au64DstArgs) 1894 && iSrcArg < pArgList->cArgs) 1895 { 1896 au64DstArgs[iDstArg] = auSrcArgs[iSrcArg]; 1897 if (VTG_TYPE_IS_LARGE(pArgList->aArgs[iDstArg].fType)) 1898 au64DstArgs[iDstArg] |= (uint64_t)auSrcArgs[++iSrcArg] << 32; 1899 iSrcArg++; 1900 iDstArg++; 1901 } 1902 while (iDstArg < RT_ELEMENTS(au64DstArgs)) 1903 au64DstArgs[iDstArg++] = auSrcArgs[iSrcArg++]; 1904 1905 pStackData->u.ProbeFireUser.offArg = iSrcArg - RT_ELEMENTS(au64DstArgs); 1906 dtrace_probe(pCtx->idProbe, au64DstArgs[0], au64DstArgs[1], au64DstArgs[2], au64DstArgs[3], au64DstArgs[4]); 1907 } 1908 #else 1725 1909 dtrace_probe(pCtx->idProbe, 1726 1910 pCtx->u.X86.aArgs[0], … … 1729 1913 pCtx->u.X86.aArgs[3], 1730 1914 pCtx->u.X86.aArgs[4]); 1915 #endif 1916 } 1731 1917 else if (pCtx->cBits == 64) 1918 { 1919 pStackData->u.ProbeFireUser.pCtx = pCtx; 1920 pStackData->u.ProbeFireUser.offArg = 0; 1732 1921 dtrace_probe(pCtx->idProbe, 1733 1922 pCtx->u.Amd64.aArgs[0], … … 1736 1925 pCtx->u.Amd64.aArgs[3], 1737 1926 pCtx->u.Amd64.aArgs[4]); 1927 } 1738 1928 else 1739 1929 AssertFailed(); 1740 1930 1741 1931 VBDT_CLEAR_STACK_DATA(); 1932 LOG_DTRACE(("%s: returns\n", __FUNCTION__)); 1742 1933 } 1743 1934 … … 1746 1937 * interface_method_impl{SUPDRVTRACERREG,pfnTracerOpen} 1747 1938 */ 1748 static DECLCALLBACK(int) vb dt_TracerOpen(PCSUPDRVTRACERREG pThis, PSUPDRVSESSION pSession, uint32_t uCookie, uintptr_t uArg,1749 uintptr_t *puSessionData)1939 static DECLCALLBACK(int) vboxDtTOps_TracerOpen(PCSUPDRVTRACERREG pThis, PSUPDRVSESSION pSession, uint32_t uCookie, 1940 uintptr_t uArg, uintptr_t *puSessionData) 1750 1941 { 1751 1942 if (uCookie != RT_MAKE_U32_FROM_U8('V', 'B', 'D', 'T')) … … 1766 1957 * interface_method_impl{SUPDRVTRACERREG,pfnTracerClose} 1767 1958 */ 1768 static DECLCALLBACK(int) vb dt_TracerIoCtl(PCSUPDRVTRACERREG pThis, PSUPDRVSESSION pSession, uintptr_t uSessionData,1769 uintptr_t uCmd, uintptr_t uArg, int32_t *piRetVal)1959 static DECLCALLBACK(int) vboxDtTOps_TracerIoCtl(PCSUPDRVTRACERREG pThis, PSUPDRVSESSION pSession, uintptr_t uSessionData, 1960 uintptr_t uCmd, uintptr_t uArg, int32_t *piRetVal) 1770 1961 { 1771 1962 AssertPtrReturn(uSessionData, VERR_INVALID_POINTER); … … 1782 1973 * interface_method_impl{SUPDRVTRACERREG,pfnTracerClose} 1783 1974 */ 1784 static DECLCALLBACK(void) vb dt_TracerClose(PCSUPDRVTRACERREG pThis, PSUPDRVSESSION pSession, uintptr_t uSessionData)1975 static DECLCALLBACK(void) vboxDtTOps_TracerClose(PCSUPDRVTRACERREG pThis, PSUPDRVSESSION pSession, uintptr_t uSessionData) 1785 1976 { 1786 1977 AssertPtrReturnVoid(uSessionData); … … 1796 1987 * interface_method_impl{SUPDRVTRACERREG,pfnProviderRegister} 1797 1988 */ 1798 static DECLCALLBACK(int) vbdt_ProviderRegister(PCSUPDRVTRACERREG pThis, PSUPDRVVDTPROVIDERCORE pCore) 1799 { 1989 static DECLCALLBACK(int) vboxDtTOps_ProviderRegister(PCSUPDRVTRACERREG pThis, PSUPDRVVDTPROVIDERCORE pCore) 1990 { 1991 LOG_DTRACE(("%s: %p %s/%s\n", __FUNCTION__, pThis, pCore->pszModName, pCore->pszName)); 1800 1992 AssertReturn(pCore->TracerData.DTrace.idProvider == 0, VERR_INTERNAL_ERROR_3); 1801 1993 VBDT_SETUP_STACK_DATA(kVBoxDtCaller_Generic); … … 1809 2001 vboxDtVtgConvAttr(&DtAttrs.dtpa_args, &pDesc->AttrArguments); 1810 2002 2003 /* Note! DTrace may call us back before dtrace_register returns, so we 2004 have to point it to pCore->TracerData.DTrace.idProvider. */ 1811 2005 AssertCompile(sizeof(dtrace_provider_id_t) == sizeof(pCore->TracerData.DTrace.idProvider)); 1812 2006 int rc = dtrace_register(pCore->pszName, … … 1819 2013 if (!rc) 1820 2014 { 1821 Assert(pCore->TracerData.DTrace.idProvider != 0); 2015 LOG_DTRACE(("%s: idProvider=%p\n", __FUNCTION__, pCore->TracerData.DTrace.idProvider)); 2016 AssertPtr(pCore->TracerData.DTrace.idProvider); 1822 2017 rc = VINF_SUCCESS; 1823 2018 } 1824 2019 else 2020 { 2021 pCore->TracerData.DTrace.idProvider = 0; 1825 2022 rc = RTErrConvertFromErrno(rc); 2023 } 1826 2024 1827 2025 VBDT_CLEAR_STACK_DATA(); 2026 LOG_DTRACE(("%s: returns %Rrc\n", __FUNCTION__, rc)); 1828 2027 return rc; 1829 2028 } … … 1833 2032 * interface_method_impl{SUPDRVTRACERREG,pfnProviderDeregister} 1834 2033 */ 1835 static DECLCALLBACK(int) vb dt_ProviderDeregister(PCSUPDRVTRACERREG pThis, PSUPDRVVDTPROVIDERCORE pCore)2034 static DECLCALLBACK(int) vboxDtTOps_ProviderDeregister(PCSUPDRVTRACERREG pThis, PSUPDRVVDTPROVIDERCORE pCore) 1836 2035 { 1837 2036 uintptr_t idProvider = pCore->TracerData.DTrace.idProvider; 1838 AssertReturn(idProvider != 0, VERR_INTERNAL_ERROR_4); 2037 LOG_DTRACE(("%s: %p / %p\n", __FUNCTION__, pThis, idProvider)); 2038 AssertPtrReturn(idProvider, VERR_INTERNAL_ERROR_3); 1839 2039 VBDT_SETUP_STACK_DATA(kVBoxDtCaller_Generic); 1840 2040 … … 1854 2054 1855 2055 VBDT_CLEAR_STACK_DATA(); 2056 LOG_DTRACE(("%s: returns %Rrc\n", __FUNCTION__, rc)); 1856 2057 return rc; 1857 2058 } … … 1861 2062 * interface_method_impl{SUPDRVTRACERREG,pfnProviderDeregisterZombie} 1862 2063 */ 1863 static DECLCALLBACK(int) vb dt_ProviderDeregisterZombie(PCSUPDRVTRACERREG pThis, PSUPDRVVDTPROVIDERCORE pCore)2064 static DECLCALLBACK(int) vboxDtTOps_ProviderDeregisterZombie(PCSUPDRVTRACERREG pThis, PSUPDRVVDTPROVIDERCORE pCore) 1864 2065 { 1865 2066 uintptr_t idProvider = pCore->TracerData.DTrace.idProvider; 1866 AssertReturn(idProvider != 0, VERR_INTERNAL_ERROR_4); 2067 LOG_DTRACE(("%s: %p / %p\n", __FUNCTION__, pThis, idProvider)); 2068 AssertPtrReturn(idProvider, VERR_INTERNAL_ERROR_3); 1867 2069 Assert(pCore->TracerData.DTrace.fZombie); 1868 2070 VBDT_SETUP_STACK_DATA(kVBoxDtCaller_Generic); … … 1881 2083 1882 2084 VBDT_CLEAR_STACK_DATA(); 2085 LOG_DTRACE(("%s: returns %Rrc\n", __FUNCTION__, rc)); 1883 2086 return rc; 1884 2087 } … … 1893 2096 SUPDRVTRACERREG_MAGIC, 1894 2097 SUPDRVTRACERREG_VERSION, 1895 vb dt_ProbeFireKernel,1896 vb dt_ProbeFireUser,1897 vb dt_TracerOpen,1898 vb dt_TracerIoCtl,1899 vb dt_TracerClose,1900 vb dt_ProviderRegister,1901 vb dt_ProviderDeregister,1902 vb dt_ProviderDeregisterZombie,2098 vboxDtTOps_ProbeFireKernel, 2099 vboxDtTOps_ProbeFireUser, 2100 vboxDtTOps_TracerOpen, 2101 vboxDtTOps_TracerIoCtl, 2102 vboxDtTOps_TracerClose, 2103 vboxDtTOps_ProviderRegister, 2104 vboxDtTOps_ProviderDeregister, 2105 vboxDtTOps_ProviderDeregisterZombie, 1903 2106 SUPDRVTRACERREG_MAGIC 1904 2107 };
Note:
See TracChangeset
for help on using the changeset viewer.

