VirtualBox

Ignore:
Timestamp:
Apr 11, 2012 9:29:23 AM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
77402
Message:

SUPDrv-dtrace.cpp: Fixed an issue with dtrace_register calling us back in supdrvDtPOps_Provide before it returns, ending up with a NULL provider id. Added logging and a whole bunch of paranoid assertions.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/Support/SUPDrv-dtrace.cpp

    r40857 r40865  
    8282typedef SUPDRVDTSTACKDATA *PSUPDRVDTSTACKDATA;
    8383
     84
     85/*******************************************************************************
     86*   Defined Constants And Macros                                               *
     87*******************************************************************************/
    8488/** The first magic value. */
    8589#define SUPDRVDT_STACK_DATA_MAGIC1      RT_MAKE_U32_FROM_U8('S', 'U', 'P', 'D')
     
    109113        pStackData->pSelf       = NULL; \
    110114    } while (0)
     115
     116/** SUPR0Printf logging.  */
     117#if 0
     118# define LOG_DTRACE(a) SUPR0Printf a
     119#else
     120# define LOG_DTRACE(a) do { } while (0)
     121#endif
    111122
    112123
     
    189200{
    190201    PSUPDRVVDTPROVIDERCORE  pProv        = (PSUPDRVVDTPROVIDERCORE)pvProv;
     202    AssertPtrReturnVoid(pProv);
     203    LOG_DTRACE(("supdrvDtPOps_Provide: %p / %p pDtProbeDesc=%p\n", pProv, pProv->TracerData.DTrace.idProvider, pDtProbeDesc));
     204    AssertPtrReturnVoid(pProv->pHdr);
    191205    PVTGPROBELOC            pProbeLoc    = pProv->pHdr->paProbLocs;
     206    AssertPtrReturnVoid(pProbeLoc);
    192207    PVTGPROBELOC            pProbeLocEnd = pProv->pHdr->paProbLocsEnd;
     208    AssertPtrReturnVoid(pProbeLocEnd);
    193209    dtrace_provider_id_t    idProvider   = pProv->TracerData.DTrace.idProvider;
     210    AssertPtrReturnVoid(idProvider);
    194211    size_t const            cbFnNmBuf    = _4K + _1K;
    195212    char                   *pszFnNmBuf;
     
    289306
    290307     RTMemFree(pszFnNmBuf);
     308     LOG_DTRACE(("supdrvDtPOps_Provide: returns\n"));
    291309}
    292310
     
    298316{
    299317    PSUPDRVVDTPROVIDERCORE  pProv  = (PSUPDRVVDTPROVIDERCORE)pvProv;
     318    AssertPtrReturn(pProv, EINVAL);
     319    LOG_DTRACE(("supdrvDtPOps_Enable: %p / %p - %#x / %p\n", pProv, pProv->TracerData.DTrace.idProvider, idProbe, pvProbe));
     320    AssertPtrReturn(pvProbe, EINVAL);
     321    AssertPtrReturn(pProv->TracerData.DTrace.idProvider, EINVAL);
     322
    300323    if (!pProv->TracerData.DTrace.fZombie)
    301324    {
     
    321344{
    322345    PSUPDRVVDTPROVIDERCORE  pProv  = (PSUPDRVVDTPROVIDERCORE)pvProv;
     346    AssertPtrReturnVoid(pProv);
     347    LOG_DTRACE(("supdrvDtPOps_Disable: %p / %p - %#x / %p\n", pProv, pProv->TracerData.DTrace.idProvider, idProbe, pvProbe));
     348    AssertPtrReturnVoid(pvProbe);
     349    AssertPtrReturnVoid(pProv->TracerData.DTrace.idProvider);
     350
    323351    if (!pProv->TracerData.DTrace.fZombie)
    324352    {
    325353        PVTGPROBELOC    pProbeLoc  = (PVTGPROBELOC)pvProbe;
    326354        PVTGDESCPROBE   pProbeDesc = (PVTGDESCPROBE)pProbeLoc->pbProbe;
     355        AssertPtrReturnVoid(pProbeDesc);
    327356
    328357        if (pProbeLoc->fEnabled)
     
    345374    unsigned                uArg   = pArgDesc->dtargd_ndx;
    346375
     376    pArgDesc->dtargd_ndx = DTRACE_ARGNONE;
     377    AssertPtrReturnVoid(pProv);
     378    LOG_DTRACE(("supdrvDtPOps_GetArgDesc: %p / %p - %#x / %p uArg=%d\n", pProv, pProv->TracerData.DTrace.idProvider, idProbe, pvProbe, uArg));
     379    AssertPtrReturnVoid(pvProbe);
     380    AssertPtrReturnVoid(pProv->TracerData.DTrace.idProvider);
     381
    347382    if (!pProv->TracerData.DTrace.fZombie)
    348383    {
    349384        PVTGPROBELOC    pProbeLoc  = (PVTGPROBELOC)pvProbe;
    350385        PVTGDESCPROBE   pProbeDesc = (PVTGDESCPROBE)pProbeLoc->pbProbe;
     386        AssertPtrReturnVoid(pProbeDesc);
     387        AssertPtrReturnVoid(pProv->pHdr);
    351388        PVTGDESCARGLIST pArgList   = (PVTGDESCARGLIST)((uintptr_t)pProv->pHdr->paArgLists + pProbeDesc->offArgList);
     389        AssertPtrReturnVoid(pArgList);
    352390
    353391        Assert(pProbeDesc->offArgList < pProv->pHdr->cbArgLists);
     
    360398                memcpy(pArgDesc->dtargd_native, pszType, cchType + 1);
    361399                /** @todo mapping */
     400                pArgDesc->dtargd_ndx = uArg;
     401                LOG_DTRACE(("supdrvDtPOps_GetArgVal: returns dtargd_native = %s\n", pArgDesc->dtargd_native));
    362402                return;
    363403            }
    364404        }
    365405    }
    366 
    367     pArgDesc->dtargd_ndx = DTRACE_ARGNONE;
    368406}
    369407
     
    404442                                       int iArg, int cFrames)
    405443{
     444    PSUPDRVVDTPROVIDERCORE  pProv  = (PSUPDRVVDTPROVIDERCORE)pvProv;
     445    AssertPtrReturn(pProv, UINT64_MAX);
     446    LOG_DTRACE(("supdrvDtPOps_GetArgVal: %p / %p - %#x / %p iArg=%d cFrames=%u\n", pProv, pProv->TracerData.DTrace.idProvider, idProbe, pvProbe, iArg, cFrames));
    406447    AssertReturn(iArg >= 5, UINT64_MAX);
     448    AssertPtrReturn(pvProbe, UINT64_MAX);
     449    AssertReturn(!pProv->TracerData.DTrace.fZombie, UINT64_MAX);
     450    AssertPtrReturn(pProv->TracerData.DTrace.idProvider, UINT64_MAX);
    407451
    408452    /* Locate the caller of probe_dtrace, . */
     
    420464
    421465    /* Get the stack data. */
     466    LOG_DTRACE(("supdrvDtPOps_GetArgVal: returns %#llx\n", (uint64_t)pData->pauStackArgs[iArg - 5]));
    422467    return pData->pauStackArgs[iArg - 5];
    423468}
     
    430475{
    431476    PSUPDRVVDTPROVIDERCORE  pProv  = (PSUPDRVVDTPROVIDERCORE)pvProv;
     477    AssertPtrReturnVoid(pProv);
     478    LOG_DTRACE(("supdrvDtPOps_Destroy: %p / %p - %#x / %p\n", pProv, pProv->TracerData.DTrace.idProvider, idProbe, pvProbe));
     479    AssertReturnVoid(pProv->TracerData.DTrace.cProvidedProbes > 0);
     480    AssertPtrReturnVoid(pProv->TracerData.DTrace.idProvider);
     481
    432482    if (!pProv->TracerData.DTrace.fZombie)
    433483    {
    434484        PVTGPROBELOC    pProbeLoc  = (PVTGPROBELOC)pvProbe;
     485        AssertPtrReturnVoid(pProbeLoc);
     486        AssertPtrReturnVoid(pProbeLoc->pszFunction);
    435487        Assert(!pProbeLoc->fEnabled);
    436         Assert(pProbeLoc->idProbe == idProbe); NOREF(idProbe);
     488        AssertReturnVoid(pProbeLoc->idProbe == idProbe);
     489
    437490        pProbeLoc->idProbe = UINT32_MAX;
    438491    }
     
    478531                                                       uintptr_t uArg3, uintptr_t uArg4)
    479532{
     533    AssertPtrReturnVoid(pVtgProbeLoc);
     534    LOG_DTRACE(("supdrvDtTOps_ProbeFireKernel: %p / %p\n", pVtgProbeLoc, pVtgProbeLoc->idProbe));
     535    AssertPtrReturnVoid(pVtgProbeLoc->pbProbe);
     536    AssertPtrReturnVoid(pVtgProbeLoc->pszFunction);
     537
    480538    SUPDRVDT_SETUP_STACK_DATA();
    481539
     
    484542
    485543    SUPDRVDT_CLEAR_STACK_DATA();
     544    LOG_DTRACE(("supdrvDtTOps_ProbeFireKernel: returns\n"));
    486545}
    487546
     
    536595static DECLCALLBACK(int) supdrvDtTOps_ProviderRegister(PCSUPDRVTRACERREG pThis, PSUPDRVVDTPROVIDERCORE pCore)
    537596{
     597    LOG_DTRACE(("supdrvDtTOps_ProviderRegister: %p %s/%s\n", pThis, pCore->pszModName, pCore->pszName));
    538598    AssertReturn(pCore->TracerData.DTrace.idProvider == UINT32_MAX || pCore->TracerData.DTrace.idProvider == 0,
    539599                 VERR_INTERNAL_ERROR_3);
     
    547607    vboxDtVtgConvAttr(&DtAttrs.dtpa_args,     &pDesc->AttrArguments);
    548608
    549     dtrace_provider_id_t idProvider;
     609    /* Note! DTrace may call us back before dtrace_register returns, so we
     610             have to point it to pCore->TracerData.DTrace.idProvider. */
    550611    int rc = dtrace_register(pCore->pszName,
    551612                             &DtAttrs,
     
    554615                             &g_vboxDtVtgProvOps,
    555616                             pCore,
    556                              &idProvider);
     617                             &pCore->TracerData.DTrace.idProvider);
     618    LOG_DTRACE(("supdrvDtTOps_ProviderRegister: idProvider=%p\n", pCore->TracerData.DTrace.idProvider));
    557619    if (!rc)
    558620    {
    559         Assert(idProvider != UINT32_MAX && idProvider != 0);
    560         pCore->TracerData.DTrace.idProvider = idProvider;
    561         Assert(pCore->TracerData.DTrace.idProvider == idProvider);
     621        Assert(pCore->TracerData.DTrace.idProvider != UINT32_MAX && pCore->TracerData.DTrace.idProvider != 0);
     622        AssertPtr(pCore->TracerData.DTrace.idProvider);
    562623        rc = VINF_SUCCESS;
    563624    }
    564625    else
     626    {
     627        pCore->TracerData.DTrace.idProvider = UINT32_MAX;
    565628        rc = RTErrConvertFromErrno(rc);
    566 
     629    }
     630
     631    LOG_DTRACE(("supdrvDtTOps_ProviderRegister: returns %Rrc\n", rc));
    567632    return rc;
    568633}
     
    575640{
    576641    uintptr_t idProvider = pCore->TracerData.DTrace.idProvider;
     642    LOG_DTRACE(("supdrvDtTOps_ProviderDeregister: %p / %p\n", pThis, idProvider));
     643    AssertPtrReturn(idProvider, VERR_INTERNAL_ERROR_3);
    577644    AssertReturn(idProvider != UINT32_MAX && idProvider != 0, VERR_INTERNAL_ERROR_4);
    578645
     
    591658    }
    592659
     660    LOG_DTRACE(("supdrvDtTOps_ProviderDeregister: returns %Rrc\n", rc));
    593661    return rc;
    594662}
     
    601669{
    602670    uintptr_t idProvider = pCore->TracerData.DTrace.idProvider;
     671    LOG_DTRACE(("supdrvDtTOps_ProviderDeregisterZombie: %p / %p\n", pThis, idProvider));
     672    AssertPtrReturn(idProvider, VERR_INTERNAL_ERROR_3);
    603673    AssertReturn(idProvider != UINT32_MAX && idProvider != 0, VERR_INTERNAL_ERROR_4);
    604674    Assert(pCore->TracerData.DTrace.fZombie);
     
    616686    }
    617687
     688    LOG_DTRACE(("supdrvDtTOps_ProviderDeregisterZombie: returns %Rrc\n", rc));
    618689    return rc;
    619690}
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette