VirtualBox

Changeset 53708 in vbox


Ignore:
Timestamp:
Jan 2, 2015 12:44:30 PM (10 years ago)
Author:
vboxsync
Message:

VBoxDTrace: unified the sources. (r85)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/ExtPacks/VBoxDTrace/VBoxDTraceR0/VBoxDTraceR0.cpp

    r53707 r53708  
    106106            /** The user context.  */
    107107            PCSUPDRVTRACERUSRCTX    pCtx;
     108            /** The argument displacement caused by 64-bit arguments passed directly to
     109             *  dtrace_probe. */
     110            int                     offArg;
    108111        } ProbeFireUser;
    109112    } u;
     
    153156            VBoxDtReleaseThread(pStackData->pThread); \
    154157    } 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
    155166
    156167
     
    13741385static void     vboxDtPOps_Provide(void *pvProv, const dtrace_probedesc_t *pDtProbeDesc)
    13751386{
    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));
    13771390
    13781391    if (pDtProbeDesc)
     
    13821395        return;
    13831396
    1384     dtrace_provider_id_t const idProvider   = pProv->TracerData.DTrace.idProvider;
     1397    dtrace_provider_id_t const idProvider = pProv->TracerData.DTrace.idProvider;
    13851398    AssertPtrReturnVoid(idProvider);
    13861399
     
    13881401    AssertReturnVoid(pProv->pHdr->offProbeLocs != 0);
    13891402    uint32_t const  cProbeLocs    = pProv->pHdr->cbProbeLocs / sizeof(VTGPROBELOC);
    1390 
    13911403
    13921404    /* Need a buffer for extracting the function names and mangling them in
     
    14071419           we've already reported. */
    14081420        PCVTGPROBELOC pProbeLocRO = &pProv->paProbeLocsRO[idxProbeLoc];
    1409         PVTGDESCPROBE pProbeDesc  = (PVTGDESCPROBE)pProbeLocRO->pbProbe;
     1421        PVTGDESCPROBE pProbeDesc  = pProbeLocRO->pProbe;
    14101422        if (pProbeDesc->idxProvider != idxProv)
    14111423            continue;
     
    14831495
    14841496     RTMemFree(pszFnNmBuf);
     1497     LOG_DTRACE(("%s: returns\n", __FUNCTION__));
    14851498}
    14861499
     
    14921505{
    14931506    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
    14941510    if (!pProv->TracerData.DTrace.fZombie)
    14951511    {
     
    14971513        PVTGPROBELOC32  pProbeLocEn = (PVTGPROBELOC32)(  (uintptr_t)pProv->pvProbeLocsEn + idxProbeLoc * pProv->cbProbeLocsEn);
    14981514        PCVTGPROBELOC   pProbeLocRO = (PVTGPROBELOC)&pProv->paProbeLocsRO[idxProbeLoc];
    1499         PCVTGDESCPROBE  pProbeDesc  = (PVTGDESCPROBE)pProbeLocRO->pbProbe;
     1515        PCVTGDESCPROBE  pProbeDesc  = pProbeLocRO->pProbe;
    15001516        uint32_t const  idxProbe    = pProbeDesc->idxEnabled;
    15011517
     
    15331549{
    15341550    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
    15351556    if (!pProv->TracerData.DTrace.fZombie)
    15361557    {
     
    15381559        PVTGPROBELOC32  pProbeLocEn = (PVTGPROBELOC32)(  (uintptr_t)pProv->pvProbeLocsEn + idxProbeLoc * pProv->cbProbeLocsEn);
    15391560        PCVTGPROBELOC   pProbeLocRO = (PVTGPROBELOC)&pProv->paProbeLocsRO[idxProbeLoc];
    1540         PCVTGDESCPROBE  pProbeDesc  = (PVTGDESCPROBE)pProbeLocRO->pbProbe;
     1561        PCVTGDESCPROBE  pProbeDesc  = pProbeLocRO->pProbe;
    15411562        uint32_t const  idxProbe    = pProbeDesc->idxEnabled;
    15421563
     
    15701591 */
    15711592static void     vboxDtPOps_GetArgDesc(void *pvProv, dtrace_id_t idProbe, void *pvProbe,
    1572                                             dtrace_argdesc_t *pArgDesc)
     1593                                      dtrace_argdesc_t *pArgDesc)
    15731594{
    15741595    PSUPDRVVDTPROVIDERCORE  pProv  = (PSUPDRVVDTPROVIDERCORE)pvProv;
    15751596    unsigned                uArg   = pArgDesc->dtargd_ndx;
     1597
    15761598    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);
    15771603
    15781604    if (!pProv->TracerData.DTrace.fZombie)
     
    15801606        uint32_t         idxProbeLoc = (uint32_t)(uintptr_t)pvProbe;
    15811607        PCVTGPROBELOC    pProbeLocRO = (PVTGPROBELOC)&pProv->paProbeLocsRO[idxProbeLoc];
    1582         PCVTGDESCPROBE   pProbeDesc  = (PVTGDESCPROBE)pProbeLocRO->pbProbe;
     1608        PCVTGDESCPROBE   pProbeDesc  = pProbeLocRO->pProbe;
    15831609        PCVTGDESCARGLIST pArgList    = (PCVTGDESCARGLIST)(  (uintptr_t)pProv->pHdr
    15841610                                                          + pProv->pHdr->offArgLists
     
    15931619            {
    15941620                memcpy(pArgDesc->dtargd_native, pszType, cchType + 1);
     1621                /** @todo mapping? */
    15951622                pArgDesc->dtargd_ndx = uArg;
    1596                 /** @todo mapping? */
     1623                LOG_DTRACE(("%s: returns dtargd_native = %s\n", __FUNCTION__, pArgDesc->dtargd_native));
    15971624                return;
    15981625            }
    15991626        }
    16001627    }
    1601 
    16021628}
    16031629
     
    16091635                                     int iArg, int cFrames)
    16101636{
    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));
    16121640    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
    16201688        if (pCtx->cBits == 32)
    16211689        {
    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            }
    16291713        }
    16301714        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;
    16361727}
    16371728
     
    16431734{
    16441735    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
    16451741    if (!pProv->TracerData.DTrace.fZombie)
    16461742    {
     
    17001796 * interface_method_impl{SUPDRVTRACERREG,pfnProbeFireKernel}
    17011797 */
    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 {
     1798static 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
    17051806    VBDT_SETUP_STACK_DATA(kVBoxDtCaller_ProbeFireKernel);
    17061807
    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
    17091845    dtrace_probe(pVtgProbeLoc->idProbe, uArg0, uArg1, uArg2, uArg3, uArg4);
     1846#endif
    17101847
    17111848    VBDT_CLEAR_STACK_DATA();
    1712     return ;
     1849    LOG_DTRACE(("%s: returns\n", __FUNCTION__));
    17131850}
    17141851
     
    17171854 * interface_method_impl{SUPDRVTRACERREG,pfnProbeFireUser}
    17181855 */
    1719 static DECLCALLBACK(void) vbdt_ProbeFireUser(PCSUPDRVTRACERREG pThis, PSUPDRVSESSION pSession, PCSUPDRVTRACERUSRCTX pCtx)
    1720 {
     1856static 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
    17211863    VBDT_SETUP_STACK_DATA(kVBoxDtCaller_ProbeFireUser);
    17221864
    1723     pStackData->u.ProbeFireUser.pCtx = pCtx;
    17241865    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
    17251909        dtrace_probe(pCtx->idProbe,
    17261910                     pCtx->u.X86.aArgs[0],
     
    17291913                     pCtx->u.X86.aArgs[3],
    17301914                     pCtx->u.X86.aArgs[4]);
     1915#endif
     1916    }
    17311917    else if (pCtx->cBits == 64)
     1918    {
     1919        pStackData->u.ProbeFireUser.pCtx   = pCtx;
     1920        pStackData->u.ProbeFireUser.offArg = 0;
    17321921        dtrace_probe(pCtx->idProbe,
    17331922                     pCtx->u.Amd64.aArgs[0],
     
    17361925                     pCtx->u.Amd64.aArgs[3],
    17371926                     pCtx->u.Amd64.aArgs[4]);
     1927    }
    17381928    else
    17391929        AssertFailed();
    17401930
    17411931    VBDT_CLEAR_STACK_DATA();
     1932    LOG_DTRACE(("%s: returns\n", __FUNCTION__));
    17421933}
    17431934
     
    17461937 * interface_method_impl{SUPDRVTRACERREG,pfnTracerOpen}
    17471938 */
    1748 static DECLCALLBACK(int) vbdt_TracerOpen(PCSUPDRVTRACERREG pThis, PSUPDRVSESSION pSession, uint32_t uCookie, uintptr_t uArg,
    1749                                          uintptr_t *puSessionData)
     1939static DECLCALLBACK(int) vboxDtTOps_TracerOpen(PCSUPDRVTRACERREG pThis, PSUPDRVSESSION pSession, uint32_t uCookie,
     1940                                               uintptr_t uArg, uintptr_t *puSessionData)
    17501941{
    17511942    if (uCookie != RT_MAKE_U32_FROM_U8('V', 'B', 'D', 'T'))
     
    17661957 * interface_method_impl{SUPDRVTRACERREG,pfnTracerClose}
    17671958 */
    1768 static DECLCALLBACK(int) vbdt_TracerIoCtl(PCSUPDRVTRACERREG pThis, PSUPDRVSESSION pSession, uintptr_t uSessionData,
    1769                                           uintptr_t uCmd, uintptr_t uArg, int32_t *piRetVal)
     1959static DECLCALLBACK(int) vboxDtTOps_TracerIoCtl(PCSUPDRVTRACERREG pThis, PSUPDRVSESSION pSession, uintptr_t uSessionData,
     1960                                                uintptr_t uCmd, uintptr_t uArg, int32_t *piRetVal)
    17701961{
    17711962    AssertPtrReturn(uSessionData, VERR_INVALID_POINTER);
     
    17821973 * interface_method_impl{SUPDRVTRACERREG,pfnTracerClose}
    17831974 */
    1784 static DECLCALLBACK(void) vbdt_TracerClose(PCSUPDRVTRACERREG pThis, PSUPDRVSESSION pSession, uintptr_t uSessionData)
     1975static DECLCALLBACK(void) vboxDtTOps_TracerClose(PCSUPDRVTRACERREG pThis, PSUPDRVSESSION pSession, uintptr_t uSessionData)
    17851976{
    17861977    AssertPtrReturnVoid(uSessionData);
     
    17961987 * interface_method_impl{SUPDRVTRACERREG,pfnProviderRegister}
    17971988 */
    1798 static DECLCALLBACK(int) vbdt_ProviderRegister(PCSUPDRVTRACERREG pThis, PSUPDRVVDTPROVIDERCORE pCore)
    1799 {
     1989static DECLCALLBACK(int) vboxDtTOps_ProviderRegister(PCSUPDRVTRACERREG pThis, PSUPDRVVDTPROVIDERCORE pCore)
     1990{
     1991    LOG_DTRACE(("%s: %p %s/%s\n", __FUNCTION__, pThis, pCore->pszModName, pCore->pszName));
    18001992    AssertReturn(pCore->TracerData.DTrace.idProvider == 0, VERR_INTERNAL_ERROR_3);
    18011993    VBDT_SETUP_STACK_DATA(kVBoxDtCaller_Generic);
     
    18092001    vboxDtVtgConvAttr(&DtAttrs.dtpa_args,     &pDesc->AttrArguments);
    18102002
     2003    /* Note! DTrace may call us back before dtrace_register returns, so we
     2004             have to point it to pCore->TracerData.DTrace.idProvider. */
    18112005    AssertCompile(sizeof(dtrace_provider_id_t) == sizeof(pCore->TracerData.DTrace.idProvider));
    18122006    int rc = dtrace_register(pCore->pszName,
     
    18192013    if (!rc)
    18202014    {
    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);
    18222017        rc = VINF_SUCCESS;
    18232018    }
    18242019    else
     2020    {
     2021        pCore->TracerData.DTrace.idProvider = 0;
    18252022        rc = RTErrConvertFromErrno(rc);
     2023    }
    18262024
    18272025    VBDT_CLEAR_STACK_DATA();
     2026    LOG_DTRACE(("%s: returns %Rrc\n", __FUNCTION__, rc));
    18282027    return rc;
    18292028}
     
    18332032 * interface_method_impl{SUPDRVTRACERREG,pfnProviderDeregister}
    18342033 */
    1835 static DECLCALLBACK(int) vbdt_ProviderDeregister(PCSUPDRVTRACERREG pThis, PSUPDRVVDTPROVIDERCORE pCore)
     2034static DECLCALLBACK(int) vboxDtTOps_ProviderDeregister(PCSUPDRVTRACERREG pThis, PSUPDRVVDTPROVIDERCORE pCore)
    18362035{
    18372036    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);
    18392039    VBDT_SETUP_STACK_DATA(kVBoxDtCaller_Generic);
    18402040
     
    18542054
    18552055    VBDT_CLEAR_STACK_DATA();
     2056    LOG_DTRACE(("%s: returns %Rrc\n", __FUNCTION__, rc));
    18562057    return rc;
    18572058}
     
    18612062 * interface_method_impl{SUPDRVTRACERREG,pfnProviderDeregisterZombie}
    18622063 */
    1863 static DECLCALLBACK(int) vbdt_ProviderDeregisterZombie(PCSUPDRVTRACERREG pThis, PSUPDRVVDTPROVIDERCORE pCore)
     2064static DECLCALLBACK(int) vboxDtTOps_ProviderDeregisterZombie(PCSUPDRVTRACERREG pThis, PSUPDRVVDTPROVIDERCORE pCore)
    18642065{
    18652066    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);
    18672069    Assert(pCore->TracerData.DTrace.fZombie);
    18682070    VBDT_SETUP_STACK_DATA(kVBoxDtCaller_Generic);
     
    18812083
    18822084    VBDT_CLEAR_STACK_DATA();
     2085    LOG_DTRACE(("%s: returns %Rrc\n", __FUNCTION__, rc));
    18832086    return rc;
    18842087}
     
    18932096    SUPDRVTRACERREG_MAGIC,
    18942097    SUPDRVTRACERREG_VERSION,
    1895     vbdt_ProbeFireKernel,
    1896     vbdt_ProbeFireUser,
    1897     vbdt_TracerOpen,
    1898     vbdt_TracerIoCtl,
    1899     vbdt_TracerClose,
    1900     vbdt_ProviderRegister,
    1901     vbdt_ProviderDeregister,
    1902     vbdt_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,
    19032106    SUPDRVTRACERREG_MAGIC
    19042107};
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