VirtualBox

Changeset 40636 in vbox for trunk/src


Ignore:
Timestamp:
Mar 26, 2012 12:14:18 PM (13 years ago)
Author:
vboxsync
Message:

Implemented VMMR0 static DTrace probes.

Location:
trunk/src
Files:
8 edited

Legend:

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

    r40617 r40636  
    4141#include <iprt/mem.h>
    4242#include <iprt/semaphore.h>
     43#include <iprt/thread.h>
    4344
    4445#ifdef RT_OS_DARWIN /** @todo figure this! */
     
    126127    /* .dtps_destroy         = */ supdrvDTracePOps_Destroy
    127128};
    128 
    129 
    130 #define VERR_SUPDRV_VTG_MAGIC                   (-3704)
    131 #define VERR_SUPDRV_VTG_BITS                    (-3705)
    132 //#define VERR_SUPDRV_VTG_RESERVED                (-3705)
    133 #define VERR_SUPDRV_VTG_BAD_HDR                 (-3706)
    134 #define VERR_SUPDRV_VTG_BAD_HDR_PTR             (-3707)
    135 #define VERR_SUPDRV_VTG_BAD_HDR_TOO_FEW         (-3708)
    136 #define VERR_SUPDRV_VTG_BAD_HDR_TOO_MUCH        (-3709)
    137 #define VERR_SUPDRV_VTG_BAD_HDR_NOT_MULTIPLE    (-3710)
    138 #define VERR_SUPDRV_VTG_STRTAB_OFF              (-3711)
    139 #define VERR_SUPDRV_VTG_BAD_STRING              (-3712)
    140 #define VERR_SUPDRV_VTG_STRING_TOO_LONG         (-3713)
    141 #define VERR_SUPDRV_VTG_BAD_ATTR                (-3714)
    142 #define VERR_SUPDRV_VTG_BAD_PROVIDER            (-3715)
    143 #define VERR_SUPDRV_VTG_BAD_PROBE               (-3716)
    144 #define VERR_SUPDRV_VTG_BAD_ARGLIST             (-3717)
    145 #define VERR_SUPDRV_VTG_BAD_PROBE_ENABLED       (-3718)
    146 #define VERR_SUPDRV_VTG_BAD_PROBE_LOC           (-3719)
    147 #define VERR_SUPDRV_VTG_ALREADY_REGISTERED      (-3720)
    148 #define VERR_SUPDRV_VTG_ONLY_ONCE_PER_SESSION   (-3721)
    149129
    150130
     
    437417                return VERR_SUPDRV_VTG_ALREADY_REGISTERED;
    438418            }
    439             if (pProv->pSession == pSession && !pProv->pImage)
     419            if (   pProv->pSession == pSession
     420                && pProv->pImage   == pImage)
    440421            {
    441422                RTSemFastMutexRelease(pDevExt->mtxDTrace);
     
    521502
    522503
    523 
    524504/**
    525505 * Registers the VTG tracepoint providers of a driver.
     
    540520
    541521
    542 
    543522/**
    544523 * Deregister the VTG tracepoint providers of a driver.
     
    572551
    573552
     553/**
     554 * Registers the VTG tracepoint providers of a module loaded by
     555 * the support driver.
     556 * 
     557 * This should be called from the ModuleInit code.
     558 *
     559 * @returns VBox status code.
     560 * @param   hMod                The module handle.
     561 * @param   pVtgHdr             The VTG header.
     562 */
     563SUPR0DECL(int) SUPR0VtgRegisterModule(void *hMod, PVTGOBJHDR pVtgHdr)
     564{
     565    PSUPDRVLDRIMAGE pImage = (PSUPDRVLDRIMAGE)hMod;
     566    PSUPDRVDEVEXT   pDevExt;
     567    uintptr_t       cbVtgObj;
     568
     569    /*
     570     * Validate input and context.
     571     */
     572    AssertPtrReturn(pImage,  VERR_INVALID_HANDLE);
     573    AssertPtrReturn(pVtgHdr, VERR_INVALID_POINTER);
     574
     575    pDevExt = pImage->pDevExt;
     576    AssertPtrReturn(pDevExt, VERR_INVALID_POINTER);
     577    AssertReturn(pDevExt->pLdrInitImage  == pImage, VERR_WRONG_ORDER);
     578    AssertReturn(pDevExt->hLdrInitThread == RTThreadNativeSelf(), VERR_WRONG_ORDER);
     579
     580    /*
     581     * Calculate the max VTG object size and hand it over to the common code.
     582     */
     583    cbVtgObj = (uintptr_t)pVtgHdr - (uintptr_t)pImage->pvImage;
     584    AssertMsgReturn(cbVtgObj /*off*/ < pImage->cbImageBits,
     585                    ("pVtgHdr=%p offVtgObj=%p cbImageBits=%p\n", pVtgHdr, cbVtgObj, pImage->cbImageBits),
     586                    VERR_INVALID_PARAMETER);
     587    cbVtgObj = pImage->cbImageBits - cbVtgObj;
     588
     589    return supdrvVtgRegister(pDevExt, pVtgHdr, cbVtgObj, pImage, NULL, pImage->szName);
     590}
     591
     592
     593/**
     594 * Module unloading hook, called after execution in the module have ceased.
     595 *
     596 * @param   pDevExt             The device extension structure.
     597 * @param   pImage              The image being unloaded.
     598 */
     599void VBOXCALL supdrvVtgModuleUnloading(PSUPDRVDEVEXT pDevExt, PSUPDRVLDRIMAGE pImage)
     600{
     601    PSUPDRVDTPROVIDER pProv, pProvNext;
     602
     603    /*
     604     * Unregister all providers belonging to this image.
     605     */
     606    RTSemFastMutexRequest(pDevExt->mtxDTrace);
     607    RTListForEachSafe(&pDevExt->DtProviderList, pProv, pProvNext, SUPDRVDTPROVIDER, ListEntry)
     608    {
     609        if (pProv->pImage == pImage)
     610        {
     611            RTListNodeRemove(&pProv->ListEntry);
     612            RTSemFastMutexRelease(pDevExt->mtxDTrace);
     613
     614            dtrace_unregister(pProv->idDtProv);
     615            RTMemFree(pProv);
     616
     617            RTSemFastMutexRequest(pDevExt->mtxDTrace);
     618        }
     619    }
     620    RTSemFastMutexRelease(pDevExt->mtxDTrace);
     621}
     622
    574623
    575624/**
     
    577626 *
    578627 * @returns VBox status code.
    579  * @param   pDevExt             The device extension structure.
    580  */
    581 int VBOXCALL supdrvDTraceInit(PSUPDRVDEVEXT pDevExt)
    582 {
     628 * @param   pDevExt             The device extension structure.
     629 * @param   pVtgFireProbe       Pointer to the SUPR0VtgFireProbe entry.
     630 */
     631int VBOXCALL supdrvVtgInit(PSUPDRVDEVEXT pDevExt, PSUPFUNC pVtgFireProbe)
     632{
     633    Assert(!strcmp(pVtgFireProbe->szName, "SUPR0VtgFireProbe"));
     634
    583635    /*
    584636     * Register a provider for this module.
     
    587639    if (RT_SUCCESS(rc))
    588640    {
     641#ifdef RT_OS_SOLARIS
     642        pVtgFireProbe->pfn = (void *)(uintptr_t)dtrace_probe;
     643#endif
    589644        RTListInit(&pDevExt->DtProviderList);
    590645        rc = supdrvVtgRegister(pDevExt, &g_VTGObjHeader, _1M, NULL /*pImage*/, NULL /*pSession*/, "vboxdrv");
     
    604659 * @param   pDevExt             The device extension structure.
    605660 */
    606 int VBOXCALL supdrvDTraceTerm(PSUPDRVDEVEXT pDevExt)
     661int VBOXCALL supdrvVtgTerm(PSUPDRVDEVEXT pDevExt)
    607662{
    608663    PSUPDRVDTPROVIDER pProv, pProvNext;
     
    625680    RTSemFastMutexDestroy(pDevExt->mtxDTrace);
    626681    pDevExt->mtxDTrace = NIL_RTSEMFASTMUTEX;
    627     return VINF_SUCCESS;
    628 }
    629 
    630 
    631 /**
    632  * Module loading hook, called before calling into the module.
    633  *
    634  * @returns VBox status code.
    635  * @param   pDevExt             The device extension structure.
    636  */
    637 int supdrvDTraceModuleLoading(PSUPDRVDEVEXT pDevExt, PSUPDRVLDRIMAGE pImage)
    638 {
    639     /*
    640      * Check for DTrace probes in the module, register a new provider for them
    641      * if found.
    642      */
    643 
    644     return VINF_SUCCESS;
    645 }
    646 
    647 
    648 /**
    649  * Module unloading hook, called after execution in the module
    650  * have ceased.
    651  *
    652  * @returns VBox status code.
    653  * @param   pDevExt             The device extension structure.
    654  */
    655 int supdrvDTraceModuleUnloading(PSUPDRVDEVEXT pDevExt, PSUPDRVLDRIMAGE pImage)
    656 {
    657     /*
    658      * Undo what we did in supdrvDTraceModuleLoading.
    659      */
    660682    return VINF_SUCCESS;
    661683}
  • trunk/src/VBox/HostDrivers/Support/SUPDrv.c

    r40611 r40636  
    163163    { "SUPR0AbsKernelFS",                       (void *)0 },
    164164    { "SUPR0AbsKernelGS",                       (void *)0 },
     165    { "SUPR0VtgFireProbe",                      (void *)SUPR0VtgFireProbe },
    165166        /* Normal function pointers: */
    166167    { "SUPR0ComponentRegisterFactory",          (void *)SUPR0ComponentRegisterFactory },
     
    203204    { "SUPR0GetPagingMode",                     (void *)SUPR0GetPagingMode },
    204205    { "SUPR0EnableVTx",                         (void *)SUPR0EnableVTx },
     206    { "SUPR0VtgRegisterModule",                 (void *)SUPR0VtgRegisterModule },
    205207    { "SUPGetGIP",                              (void *)SUPGetGIP },
    206208    { "g_pSUPGlobalInfoPage",                   (void *)&g_pSUPGlobalInfoPage },
     
    465467                    {
    466468#ifdef VBOX_WITH_DTRACE_R0DRV
    467                         rc = supdrvDTraceInit(pDevExt);
     469                        rc = supdrvVtgInit(pDevExt, &g_aFunctions[10]);
    468470                        if (RT_SUCCESS(rc))
    469471#endif
    470472                        {
    471 
    472                             pDevExt->u32Cookie = BIRD;  /** @todo make this random? */
    473                             pDevExt->cbSession = (uint32_t)cbSession;
     473                            pDevExt->pLdrInitImage  = NULL;
     474                            pDevExt->hLdrInitThread = NIL_RTNATIVETHREAD;
     475                            pDevExt->u32Cookie      = BIRD;  /** @todo make this random? */
     476                            pDevExt->cbSession      = (uint32_t)cbSession;
    474477
    475478                            /*
     
    624627
    625628#ifdef VBOX_WITH_DTRACE_R0DRV
    626     supdrvDTraceTerm(pDevExt);
     629    supdrvVtgTerm(pDevExt);
    627630#endif
    628631
     
    36643667
    36653668
     3669#if defined(VBOX_WITH_DTRACE_R0DRV) || defined(RT_OS_SOLARIS)
     3670/**
     3671 * Stub function.
     3672 */
     3673SUPR0DECL(void) SUPR0VtgFireProbe(uint32_t idProbe, uintptr_t uArg0, uintptr_t uArg1, uintptr_t uArg2,
     3674                                  uintptr_t uArg3, uintptr_t uArg4)
     3675{
     3676    NOREF(idProbe); NOREF(uArg0); NOREF(uArg1); NOREF(uArg2); NOREF(uArg3); NOREF(uArg4);
     3677}
     3678#endif
     3679
     3680#ifndef VBOX_WITH_DTRACE_R0DRV
     3681/**
     3682 * Stub function.
     3683 */
     3684SUPR0DECL(int) SUPR0VtgRegisterModule(void *hMod, PVTGOBJHDR pVtgHdr)
     3685{
     3686    NOREF(hMod); NOREF(pVtgHdr);
     3687    return VINF_SUCCESS;
     3688}
     3689#endif
     3690
     3691
    36663692/**
    36673693 * Adds a memory object to the session.
     
    38593885    pImage->uState          = SUP_IOCTL_LDR_OPEN;
    38603886    pImage->cUsage          = 1;
     3887    pImage->pDevExt         = pDevExt;
    38613888    memcpy(pImage->szName, pReq->u.In.szName, cchName + 1);
    38623889
     
    41134140    {
    41144141        Log(("supdrvIOCtl_LdrLoad: calling pfnModuleInit=%p\n", pImage->pfnModuleInit));
    4115         rc = pImage->pfnModuleInit();
    4116         if (rc && pDevExt->pvVMMR0 == pImage->pvImage)
     4142        pDevExt->pLdrInitImage  = pImage;
     4143        pDevExt->hLdrInitThread = RTThreadNativeSelf();
     4144        rc = pImage->pfnModuleInit(pImage);
     4145        pDevExt->pLdrInitImage  = NULL;
     4146        pDevExt->hLdrInitThread = NIL_RTNATIVETHREAD;
     4147        if (RT_FAILURE(rc) && pDevExt->pvVMMR0 == pImage->pvImage)
    41174148            supdrvLdrUnsetVMMR0EPs(pDevExt);
    41184149    }
     
    41204151    if (RT_FAILURE(rc))
    41214152    {
     4153#ifdef VBOX_WITH_DTRACE_R0DRV
     4154        /* Inform the tracing component in case ModuleInit registered TPs. */
     4155        supdrvVtgModuleUnloading(pDevExt, pImage);
     4156#endif
     4157
    41224158        pImage->uState              = SUP_IOCTL_LDR_OPEN;
    41234159        pImage->pfnModuleInit       = NULL;
     
    45614597    {
    45624598        LogFlow(("supdrvIOCtl_LdrLoad: calling pfnModuleTerm=%p\n", pImage->pfnModuleTerm));
    4563         pImage->pfnModuleTerm();
    4564     }
     4599        pImage->pfnModuleTerm(pImage);
     4600    }
     4601
     4602#ifdef VBOX_WITH_DTRACE_R0DRV
     4603    /* Inform the tracing component. */
     4604    supdrvVtgModuleUnloading(pDevExt, pImage);
     4605#endif
    45654606
    45664607    /* do native unload if appropriate. */
     
    45694610
    45704611    /* free the image */
    4571     pImage->cUsage = 0;
    4572     pImage->pNext  = 0;
    4573     pImage->uState = SUP_IOCTL_LDR_FREE;
     4612    pImage->cUsage  = 0;
     4613    pImage->pDevExt = NULL;
     4614    pImage->pNext   = NULL;
     4615    pImage->uState  = SUP_IOCTL_LDR_FREE;
    45744616    RTMemExecFree(pImage->pvImageAlloc, pImage->cbImageBits + 31);
    45754617    pImage->pvImageAlloc = NULL;
  • trunk/src/VBox/HostDrivers/Support/SUPDrvIOC.h

    r37591 r40636  
    193193 *          - None.
    194194 */
    195 #define SUPDRV_IOC_VERSION                              0x00190000
     195#define SUPDRV_IOC_VERSION                              0x00190001
    196196
    197197/** SUP_IOCTL_COOKIE. */
     
    325325 *
    326326 * @returns 0 on success.
    327  * @returns Appropriate error code on failure.
    328  */
    329 typedef DECLCALLBACK(int) FNR0MODULEINIT(void);
     327 * @returns Appropriate error code on failure.
     328 * @param   hMod        Image handle for use in APIs.
     329 */
     330typedef DECLCALLBACK(int) FNR0MODULEINIT(void *hMod);
    330331/** Pointer to a FNR0MODULEINIT(). */
    331332typedef R0PTRTYPE(FNR0MODULEINIT *) PFNR0MODULEINIT;
     
    333334/**
    334335 * Module termination callback function.
    335  * This is called once right before the module is being unloaded.
    336  */
    337 typedef DECLCALLBACK(void) FNR0MODULETERM(void);
     336 * This is called once right before the module is being unloaded.
     337 * 
     338 * @param   hMod        Image handle for use in APIs.
     339 */
     340typedef DECLCALLBACK(void) FNR0MODULETERM(void *hMod);
    338341/** Pointer to a FNR0MODULETERM(). */
    339342typedef R0PTRTYPE(FNR0MODULETERM *) PFNR0MODULETERM;
  • trunk/src/VBox/HostDrivers/Support/SUPDrvInternal.h

    r40611 r40636  
    295295    /** Usage count. */
    296296    uint32_t volatile               cUsage;
     297    /** Pointer to the device extension. */
     298    struct SUPDRVDEVEXT            *pDevExt;
    297299#ifdef RT_OS_WINDOWS
    298300    /** The section object for the loaded image (fNative=true). */
     
    493495    PSUPDRVLDRIMAGE volatile        pLdrImages;
    494496
     497    /** @name These members for detecting whether an API caller is in ModuleInit.
     498     * Certain APIs are only permitted from ModuleInit, like for instance tracepoint
     499     * registration.
     500     * @{ */
     501    /** The image currently executing its ModuleInit. */
     502    PSUPDRVLDRIMAGE volatile        pLdrInitImage;
     503    /** The thread currently executing a ModuleInit function. */
     504    RTNATIVETHREAD volatile         hLdrInitThread;
     505    /** @} */
     506
     507
    495508    /** GIP mutex.
    496509     * Any changes to any of the GIP members requires ownership of this mutex,
     
    621634
    622635#ifdef VBOX_WITH_DTRACE_R0DRV
    623 int  VBOXCALL   supdrvDTraceTerm(PSUPDRVDEVEXT pDevExt);
    624 int  VBOXCALL   supdrvDTraceInit(PSUPDRVDEVEXT pDevExt);
    625 #endif
    626 
     636int  VBOXCALL   supdrvVtgInit(PSUPDRVDEVEXT pDevExt, PSUPFUNC pVtgFireProbe);
     637int  VBOXCALL   supdrvVtgTerm(PSUPDRVDEVEXT pDevExt);
     638void VBOXCALL   supdrvVtgModuleUnloading(PSUPDRVDEVEXT pDevExt, PSUPDRVLDRIMAGE pImage);
     639#endif
    627640
    628641
  • trunk/src/VBox/HostDrivers/Support/SUPLib.cpp

    r39086 r40636  
    267267        strcpy(CookieReq.u.In.szMagic, SUPCOOKIE_MAGIC);
    268268        CookieReq.u.In.u32ReqVersion = SUPDRV_IOC_VERSION;
    269         const uint32_t uMinVersion = (SUPDRV_IOC_VERSION & 0xffff0000) == 0x00170000
    270                                    ? 0x00170002
     269        const uint32_t uMinVersion = (SUPDRV_IOC_VERSION & 0xffff0000) == 0x00190000
     270                                   ? 0x00190001
    271271                                   : SUPDRV_IOC_VERSION & 0xffff0000;
    272272        CookieReq.u.In.u32MinVersion = uMinVersion;
  • trunk/src/VBox/VMM/Makefile.kmk

    r40595 r40636  
    466466
    467467 VMMR0_SOURCES   = \
     468        VBoxVMM.d \
    468469        VMMR0/CPUMR0.cpp \
    469         VBoxVMM.d \
    470470        VMMR0/CPUMR0A.asm \
    471471        VMMR0/GMMR0.cpp \
  • trunk/src/VBox/VMM/VMMR0/VMMR0.cpp

    r40424 r40636  
    5353#include <iprt/timer.h>
    5454
     55#include "dtrace/VBoxVMM.h"
     56
     57
    5558#if defined(_MSC_VER) && defined(RT_ARCH_AMD64) /** @todo check this with with VC7! */
    5659#  pragma intrinsic(_AddressOfReturnAddress)
     
    6265*******************************************************************************/
    6366RT_C_DECLS_BEGIN
    64 VMMR0DECL(int) ModuleInit(void);
    65 VMMR0DECL(void) ModuleTerm(void);
     67VMMR0DECL(int)  ModuleInit(void *hMod);
     68VMMR0DECL(void) ModuleTerm(void *hMod);
    6669
    6770#if defined(RT_ARCH_X86) && (defined(RT_OS_SOLARIS) || defined(RT_OS_FREEBSD))
     
    101104 * @returns 0 on success.
    102105 * @returns VBox status on failure.
    103  */
    104 VMMR0DECL(int) ModuleInit(void)
    105 {
     106 * @param   hMod        Image handle for use in APIs.
     107 */
     108VMMR0DECL(int) ModuleInit(void *hMod)
     109{
     110#ifdef VBOX_WITH_DTRACE_R0
     111    /*
     112     * The first thing to do is register the static tracepoints.
     113     * (Deregistration is automatic.)
     114     */
     115    int rc2 = SUPR0VtgRegisterModule(hMod, &g_VTGObjHeader);
     116    if (RT_FAILURE(rc2))
     117        return rc2;
     118#endif
    106119    LogFlow(("ModuleInit:\n"));
    107120
     
    184197/**
    185198 * Terminate the module.
    186  * This is called when we're finally unloaded.
    187  */
    188 VMMR0DECL(void) ModuleTerm(void)
     199 * This is called when we're finally unloaded.
     200 * 
     201 * @param   hMod        Image handle for use in APIs.
     202 */
     203VMMR0DECL(void) ModuleTerm(void *hMod)
    189204{
    190205    LogFlow(("ModuleTerm:\n"));
  • trunk/src/bldprogs/VBoxTpG.cpp

    r40619 r40636  
    160160static unsigned             g_cAssemblerOptions         = 0;
    161161static const char          *g_apszAssemblerOptions[32];
    162 static const char          *g_pszProbeFnName            = "SUPR0FireProbe";
     162static const char          *g_pszProbeFnName            = "SUPR0VtgFireProbe";
    163163static bool                 g_fProbeFnImported          = true;
    164164/** @} */
     
    930930            ScmStreamPrintf(pStrm,
    931931                            "); \\\n"
    932                             "        } \\\n");
     932                            "        } \\\n"
     933                            "        { \\\n" );
    933934            RTListForEach(&pProbe->ArgHead, pArg, VTGARG, ListEntry)
    934935            {
     
    940941            }
    941942            ScmStreamPrintf(pStrm,
     943                            "        } \\\n"
    942944                            "    } while (0)\n"
    943945                            "\n");
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