VirtualBox

Changeset 40819 in vbox for trunk/src/VBox/HostDrivers


Ignore:
Timestamp:
Apr 7, 2012 8:53:40 PM (13 years ago)
Author:
vboxsync
Message:

SUPDrv: Added three new IOCtls for talking to the tracer.

Location:
trunk/src/VBox/HostDrivers/Support
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/Support/SUPDrv.c

    r40806 r40819  
    695695                    pSession->R0Process     = NIL_RTR0PROCESS;
    696696                }
     697                /*pSession->uTracerData       = 0;*/
     698                pSession->hTracerCaller     = NIL_RTNATIVETHREAD;
    697699
    698700                VBOXDRV_SESSION_CREATE(pSession, fUser);
     
    11161118        { \
    11171119            OSDBGPRINT(( #Name ": Invalid input/output sizes. cbIn=%ld expected %ld. cbOut=%ld expected %ld.\n", \
    1118                         (long)pReq->Hdr.cbIn, (long)(cbInExpect), (long)pReq->Hdr.cbOut, (long)(cbOutExpect))); \
     1120                        (long)pReqHdr->cbIn, (long)(cbInExpect), (long)pReqHdr->cbOut, (long)(cbOutExpect))); \
    11191121            VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VERR_INVALID_PARAMETER, VERR_INVALID_PARAMETER); \
    1120             return pReq->Hdr.rc = VERR_INVALID_PARAMETER; \
     1122            return pReqHdr->rc = VERR_INVALID_PARAMETER; \
    11211123        } \
    11221124    } while (0)
     
    11291131        { \
    11301132            OSDBGPRINT(( #Name ": Invalid input/output sizes. cbIn=%ld expected %ld.\n", \
    1131                         (long)pReq->Hdr.cbIn, (long)(cbInExpect))); \
     1133                        (long)pReqHdr->cbIn, (long)(cbInExpect))); \
    11321134            VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VERR_INVALID_PARAMETER, VERR_INVALID_PARAMETER); \
    1133             return pReq->Hdr.rc = VERR_INVALID_PARAMETER; \
     1135            return pReqHdr->rc = VERR_INVALID_PARAMETER; \
    11341136        } \
    11351137    } while (0)
     
    11401142        { \
    11411143            OSDBGPRINT(( #Name ": Invalid input/output sizes. cbOut=%ld expected %ld.\n", \
    1142                         (long)pReq->Hdr.cbOut, (long)(cbOutExpect))); \
     1144                        (long)pReqHdr->cbOut, (long)(cbOutExpect))); \
    11431145            VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VERR_INVALID_PARAMETER, VERR_INVALID_PARAMETER); \
    1144             return pReq->Hdr.rc = VERR_INVALID_PARAMETER; \
     1146            return pReqHdr->rc = VERR_INVALID_PARAMETER; \
    11451147        } \
    11461148    } while (0)
     
    11521154            OSDBGPRINT(( #Name ": %s\n", #expr)); \
    11531155            VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VERR_INVALID_PARAMETER, VERR_INVALID_PARAMETER); \
    1154             return pReq->Hdr.rc = VERR_INVALID_PARAMETER; \
     1156            return pReqHdr->rc = VERR_INVALID_PARAMETER; \
    11551157        } \
    11561158    } while (0)
     
    11621164            OSDBGPRINT( fmt ); \
    11631165            VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VERR_INVALID_PARAMETER, VERR_INVALID_PARAMETER); \
    1164             return pReq->Hdr.rc = VERR_INVALID_PARAMETER; \
     1166            return pReqHdr->rc = VERR_INVALID_PARAMETER; \
    11651167        } \
    11661168    } while (0)
     
    18251827        }
    18261828
     1829        case SUP_CTL_CODE_NO_SIZE(SUP_IOCTL_TRACER_OPEN):
     1830        {
     1831            /* validate */
     1832            PSUPTRACEROPEN pReq = (PSUPTRACEROPEN)pReqHdr;
     1833            REQ_CHECK_SIZES(SUP_IOCTL_TRACER_OPEN);
     1834
     1835            /* execute */
     1836            pReq->Hdr.rc = supdrvIOCtl_TracerOpen(pDevExt, pSession, pReq->u.In.uCookie, pReq->u.In.uArg);
     1837            VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);
     1838            return 0;
     1839        }
     1840
     1841        case SUP_CTL_CODE_NO_SIZE(SUP_IOCTL_TRACER_CLOSE):
     1842        {
     1843            /* validate */
     1844            REQ_CHECK_SIZES(SUP_IOCTL_TRACER_CLOSE);
     1845
     1846            /* execute */
     1847            pReqHdr->rc = supdrvIOCtl_TracerClose(pDevExt, pSession);
     1848            VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReqHdr->rc);
     1849            return 0;
     1850        }
     1851
     1852        case SUP_CTL_CODE_NO_SIZE(SUP_IOCTL_TRACER_IOCTL):
     1853        {
     1854            /* validate */
     1855            PSUPTRACERIOCTL pReq = (PSUPTRACERIOCTL)pReqHdr;
     1856            REQ_CHECK_SIZES(SUP_IOCTL_TRACER_IOCTL);
     1857
     1858            /* execute */
     1859            pReqHdr->rc = supdrvIOCtl_TracerIOCtl(pDevExt, pSession, pReq->u.In.uCmd, pReq->u.In.uArg, &pReq->u.Out.iRetVal);
     1860            VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReqHdr->rc);
     1861            return 0;
     1862        }
     1863
    18271864        default:
    18281865            Log(("Unknown IOCTL %#lx\n", (long)uIOCtl));
  • trunk/src/VBox/HostDrivers/Support/SUPDrvIOC.h

    r40806 r40819  
    193193 *          - Remove RTSpinlockReleaseNoInts.
    194194 */
    195 #define SUPDRV_IOC_VERSION                              0x001a0000
     195#define SUPDRV_IOC_VERSION                              0x001a0001
    196196
    197197/** SUP_IOCTL_COOKIE. */
     
    10921092/** @} */
    10931093
     1094
    10941095/** @name SUP_IOCTL_SEM_OP3
    10951096 * Semaphore operations.
     
    11411142/** @} */
    11421143
     1144
    11431145/** @name SUP_IOCTL_VT_CAPS
    11441146 * Get the VT-x/AMD-V capabilities.
     
    11681170/** @} */
    11691171
     1172
     1173/** @name SUP_IOCTL_TRACER_OPEN
     1174 * Open the tracer.
     1175 *
     1176 * Should be matched by an SUP_IOCTL_TRACER_CLOSE call.
     1177 *
     1178 * @{
     1179 */
     1180#define SUP_IOCTL_TRACER_OPEN                           SUP_CTL_CODE_SIZE(28, SUP_IOCTL_TRACER_OPEN_SIZE)
     1181#define SUP_IOCTL_TRACER_OPEN_SIZE                      sizeof(SUPTRACEROPEN)
     1182#define SUP_IOCTL_TRACER_OPEN_SIZE_IN                   sizeof(SUPTRACEROPEN)
     1183#define SUP_IOCTL_TRACER_OPEN_SIZE_OUT                  sizeof(SUPREQHDR)
     1184typedef struct SUPTRACEROPEN
     1185{
     1186    /** The header. */
     1187    SUPREQHDR               Hdr;
     1188    union
     1189    {
     1190        struct
     1191        {
     1192            /** Tracer cookie.  Used to make sure we only open a matching tracer. */
     1193            uint32_t        uCookie;
     1194            /** Tracer specific argument. */
     1195            RTHCUINTPTR     uArg;
     1196        } In;
     1197    } u;
     1198} SUPTRACEROPEN, *PSUPTRACEROPEN;
     1199/** @} */
     1200
     1201
     1202/** @name SUP_IOCTL_TRACER_CLOSE
     1203 * Close the tracer.
     1204 *
     1205 * Must match a SUP_IOCTL_TRACER_OPEN call.
     1206 *
     1207 * @{
     1208 */
     1209#define SUP_IOCTL_TRACER_CLOSE                          SUP_CTL_CODE_SIZE(29, SUP_IOCTL_TRACER_CLOSE_SIZE)
     1210#define SUP_IOCTL_TRACER_CLOSE_SIZE                     sizeof(SUPREQHDR)
     1211#define SUP_IOCTL_TRACER_CLOSE_SIZE_IN                  sizeof(SUPREQHDR)
     1212#define SUP_IOCTL_TRACER_CLOSE_SIZE_OUT                 sizeof(SUPREQHDR)
     1213/** @} */
     1214
     1215
     1216/** @name SUP_IOCTL_TRACER_IOCTL
     1217 * Speak UNIX ioctl() with the tracer.
     1218 *
     1219 * The session must have opened the tracer prior to issuing this request.
     1220 *
     1221 * @{
     1222 */
     1223#define SUP_IOCTL_TRACER_IOCTL                          SUP_CTL_CODE_SIZE(30, SUP_IOCTL_TRACER_IOCTL_SIZE)
     1224#define SUP_IOCTL_TRACER_IOCTL_SIZE                     sizeof(SUPTRACERIOCTL)
     1225#define SUP_IOCTL_TRACER_IOCTL_SIZE_IN                  sizeof(SUPTRACERIOCTL)
     1226#define SUP_IOCTL_TRACER_IOCTL_SIZE_OUT                 (RT_UOFFSETOF(SUPTRACERIOCTL, u.Out.iRetVal) + sizeof(int32_t))
     1227typedef struct SUPTRACERIOCTL
     1228{
     1229    /** The header. */
     1230    SUPREQHDR               Hdr;
     1231    union
     1232    {
     1233        struct
     1234        {
     1235            /** The command. */
     1236            RTHCUINTPTR     uCmd;
     1237            /** Argument to the command. */
     1238            RTHCUINTPTR     uArg;
     1239        } In;
     1240
     1241        struct
     1242        {
     1243            /** The return value. */
     1244            int32_t         iRetVal;
     1245        } Out;
     1246    } u;
     1247} SUPTRACERIOCTL, *PSUPTRACERIOCTL;
     1248/** @} */
     1249
     1250
    11701251#pragma pack()                          /* paranoia */
    11711252
  • trunk/src/VBox/HostDrivers/Support/SUPDrvInternal.h

    r40806 r40819  
    438438    /** Per session tracer specfic data. */
    439439    uintptr_t                       uTracerData;
     440    /** The thread currently actively talking to the tracer. (One at the time!) */
     441    RTNATIVETHREAD                  hTracerCaller;
    440442#ifndef SUPDRV_AGNOSTIC
    441443# if defined(RT_OS_DARWIN)
     
    555557    /** The tracer helpers. */
    556558    SUPDRVTRACERHLP                 TracerHlp;
     559    /** The number of session having opened the tracer currently. */
     560    uint32_t                        cTracerOpens;
    557561    /** Set if the tracer is being unloaded. */
    558562    bool                            fTracerUnloading;
     
    651655void VBOXCALL   supdrvTracerModuleUnloading(PSUPDRVDEVEXT pDevExt, PSUPDRVLDRIMAGE pImage);
    652656void VBOXCALL   supdrvTracerCleanupSession(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession);
     657int  VBOXCALL   supdrvIOCtl_TracerOpen(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, uint32_t uCookie, uintptr_t uArg);
     658int  VBOXCALL   supdrvIOCtl_TracerClose(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession);
     659int  VBOXCALL   supdrvIOCtl_TracerIOCtl(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, uintptr_t uCmd, uintptr_t uArg, int32_t *piRetVal);
    653660extern PFNRT    g_pfnSupdrvProbeFireKernel;
    654661DECLASM(void)   supdrvTracerProbeFireStub(void);
  • trunk/src/VBox/HostDrivers/Support/SUPDrvTracer.cpp

    r40813 r40819  
    150150    uintptr_t   offTmp;
    151151    uintptr_t   i;
     152    uintptr_t   cProviders;
    152153    int         rc;
    153     uint32_t    cProviders;
    154154
    155155    if (!pbImage || !cbImage)
     
    436436
    437437    /*
    438      * Try unregister zombies now, sleep on busy ones.
     438     * Try unregister zombies now, sleep on busy ones and tracer opens.
    439439     */
    440440    for (i = 0; ; i++)
     
    443443
    444444        RTSemFastMutexRequest(pDevExt->mtxTracer);
     445
     446        /* Zombies */
    445447        RTListForEachSafe(&pDevExt->TracerProviderZombieList, pProv, pProvNext, SUPDRVTPPROVIDER, ListEntry)
    446448        {
     
    467469
    468470        fEmpty = RTListIsEmpty(&pDevExt->TracerProviderZombieList);
     471
     472        /* Tracer opens. */
     473        if (   pDevExt->cTracerOpens
     474            && pDevExt->pTracerOps)
     475        {
     476            fEmpty = false;
     477            if (!(i & 0xf))
     478                SUPR0Printf("supdrvTracerRemoveAllProviders: Waiting on %u opens\n", pDevExt->cTracerOpens);
     479            else
     480                LOG_TRACER(("supdrvTracerRemoveAllProviders: Waiting on %u opens\n", pDevExt->cTracerOpens));
     481        }
     482
    469483        RTSemFastMutexRelease(pDevExt->mtxTracer);
     484
    470485        if (fEmpty)
    471486            break;
     
    492507{
    493508    int                 rc;
    494     unsigned            i;
     509    uintptr_t           i;
    495510    PSUPDRVTPPROVIDER   pProv;
    496511
     
    845860        {
    846861            int rc;
    847             LOG_TRACER(("supdrvTracerRemoveAllProviders: Attemting to unregister '%s' / %p...\n",
     862            LOG_TRACER(("supdrvTracerCommonDeregisterImpl: Attemting to unregister '%s' / %p...\n",
    848863                        pProv->szName, pProv->Core.TracerData.DTrace.idProvider));
    849864
     
    876891        {
    877892            int rc;
    878             LOG_TRACER(("supdrvTracerRemoveAllProviders: Attemting to unregister '%s' / %p (zombie)...\n",
     893            LOG_TRACER(("supdrvTracerCommonDeregisterImpl: Attemting to unregister '%s' / %p (zombie)...\n",
    879894                        pProv->szName, pProv->Core.TracerData.DTrace.idProvider));
    880895
     
    889904                cZombies++;
    890905                if (!(i & 0xf))
    891                     SUPR0Printf("supdrvTracerRemoveAllProviders: Waiting on busy provider '%s' / %p (rc=%d)\n",
     906                    SUPR0Printf("supdrvTracerCommonDeregisterImpl: Waiting on busy provider '%s' / %p (rc=%d)\n",
    892907                                pProv->szName, pProv->Core.TracerData.DTrace.idProvider, rc);
    893908                else
    894                     LOG_TRACER(("supdrvTracerRemoveAllProviders: Failed to unregister provider '%s' / %p - rc=%d\n",
     909                    LOG_TRACER(("supdrvTracerCommonDeregisterImpl: Failed to unregister provider '%s' / %p - rc=%d\n",
    895910                                pProv->szName, pProv->Core.TracerData.DTrace.idProvider, rc));
    896911            }
    897912        }
    898913
     914        /* Tracer opens. */
     915        if (pDevExt->cTracerOpens)
     916        {
     917            cZombies++;
     918            if (!(i & 0xf))
     919                SUPR0Printf("supdrvTracerCommonDeregisterImpl: Waiting on %u opens\n", pDevExt->cTracerOpens);
     920            else
     921                LOG_TRACER(("supdrvTracerCommonDeregisterImpl: Waiting on %u opens\n", pDevExt->cTracerOpens));
     922        }
     923
     924        /* Done? */
    899925        if (cZombies == 0)
    900926            break;
     
    10141040        .previous                                                       \n\
    10151041");
     1042# if 0 /* Slickedit on windows highlighting fix */
     1043 )
     1044# endif
    10161045#endif
    10171046
     
    11111140
    11121141/**
     1142 * Open the tracer.
     1143 *
     1144 * @returns VBox status code
     1145 * @param   pDevExt             The device extension structure.
     1146 * @param   pSession            The current session.
     1147 * @param   uCookie             The tracer cookie.
     1148 * @param   uArg                The tracer open argument.
     1149 */
     1150int  VBOXCALL   supdrvIOCtl_TracerOpen(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, uint32_t uCookie, uintptr_t uArg)
     1151{
     1152    RTNATIVETHREAD  hNativeSelf = RTThreadNativeSelf();
     1153    int             rc;
     1154
     1155    RTSemFastMutexRequest(pDevExt->mtxTracer);
     1156
     1157    if (!pSession->uTracerData)
     1158    {
     1159        if (pDevExt->pTracerOps)
     1160        {
     1161            if (pDevExt->pTracerSession != pSession)
     1162            {
     1163                if (!pDevExt->fTracerUnloading)
     1164                {
     1165                    if (pSession->hTracerCaller == NIL_RTNATIVETHREAD)
     1166                    {
     1167                        pDevExt->cTracerOpens++;
     1168                        pSession->uTracerData   = ~(uintptr_t)0;
     1169                        pSession->hTracerCaller = hNativeSelf;
     1170                        RTSemFastMutexRelease(pDevExt->mtxTracer);
     1171
     1172                        rc = pDevExt->pTracerOps->pfnTracerOpen(pDevExt->pTracerOps, pSession, uCookie, uArg, &pSession->uTracerData);
     1173
     1174                        RTSemFastMutexRequest(pDevExt->mtxTracer);
     1175                        if (RT_FAILURE(rc))
     1176                        {
     1177                            pDevExt->cTracerOpens--;
     1178                            pSession->uTracerData = 0;
     1179                        }
     1180                        pSession->hTracerCaller = NIL_RTNATIVETHREAD;
     1181                    }
     1182                    else
     1183                        rc = VERR_SUPDRV_TRACER_SESSION_BUSY;
     1184                }
     1185                else
     1186                    rc = VERR_SUPDRV_TRACER_UNLOADING;
     1187            }
     1188            else
     1189                rc = VERR_SUPDRV_TRACER_CANNOT_OPEN_SELF;
     1190        }
     1191        else
     1192            rc = VERR_SUPDRV_TRACER_NOT_PRESENT;
     1193    }
     1194    else
     1195        rc = VERR_SUPDRV_TRACER_ALREADY_OPENED;
     1196
     1197    RTSemFastMutexRelease(pDevExt->mtxTracer);
     1198    return rc;
     1199}
     1200
     1201
     1202/**
     1203 * Closes the tracer.
     1204 *
     1205 * @returns VBox status code.
     1206 * @param   pDevExt             The device extension structure.
     1207 * @param   pSession            The current session.
     1208 */
     1209int  VBOXCALL   supdrvIOCtl_TracerClose(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession)
     1210{
     1211    RTNATIVETHREAD  hNativeSelf = RTThreadNativeSelf();
     1212    int             rc;
     1213
     1214    RTSemFastMutexRequest(pDevExt->mtxTracer);
     1215
     1216    if (pSession->uTracerData)
     1217    {
     1218        Assert(pDevExt->cTracerOpens > 0);
     1219
     1220        if (pDevExt->pTracerOps)
     1221        {
     1222            if (pSession->hTracerCaller == NIL_RTNATIVETHREAD)
     1223            {
     1224                uintptr_t uTracerData   = pSession->uTracerData;
     1225                pSession->uTracerData   = 0;
     1226                pSession->hTracerCaller = hNativeSelf;
     1227                RTSemFastMutexRelease(pDevExt->mtxTracer);
     1228
     1229                pDevExt->pTracerOps->pfnTracerClose(pDevExt->pTracerOps, pSession, uTracerData);
     1230                rc = VINF_SUCCESS;
     1231
     1232                RTSemFastMutexRequest(pDevExt->mtxTracer);
     1233                pSession->hTracerCaller = NIL_RTNATIVETHREAD;
     1234                Assert(pDevExt->cTracerOpens > 0);
     1235                pDevExt->cTracerOpens--;
     1236            }
     1237            else
     1238                rc = VERR_SUPDRV_TRACER_SESSION_BUSY;
     1239        }
     1240        else
     1241        {
     1242            rc = VERR_SUPDRV_TRACER_NOT_PRESENT;
     1243            pSession->uTracerData = 0;
     1244            Assert(pDevExt->cTracerOpens > 0);
     1245            pDevExt->cTracerOpens--;
     1246        }
     1247    }
     1248    else
     1249        rc = VERR_SUPDRV_TRACER_NOT_OPENED;
     1250
     1251    RTSemFastMutexRelease(pDevExt->mtxTracer);
     1252    return rc;
     1253}
     1254
     1255
     1256/**
     1257 * Performs a tracer I/O control request.
     1258 *
     1259 * @returns VBox status code.
     1260 * @param   pDevExt             The device extension structure.
     1261 * @param   pSession            The current session.
     1262 * @param   uCmd                The tracer command.
     1263 * @param   uArg                The tracer argument.
     1264 * @param   piRetVal            Where to store the tracer specific return value.
     1265 */
     1266int  VBOXCALL   supdrvIOCtl_TracerIOCtl(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, uintptr_t uCmd, uintptr_t uArg, int32_t *piRetVal)
     1267{
     1268    RTNATIVETHREAD  hNativeSelf = RTThreadNativeSelf();
     1269    int             rc;
     1270
     1271    RTSemFastMutexRequest(pDevExt->mtxTracer);
     1272
     1273    if (pSession->uTracerData)
     1274    {
     1275        Assert(pDevExt->cTracerOpens > 0);
     1276        if (pDevExt->pTracerOps)
     1277        {
     1278            if (!pDevExt->fTracerUnloading)
     1279            {
     1280                if (pSession->hTracerCaller == NIL_RTNATIVETHREAD)
     1281                {
     1282                    uintptr_t uTracerData = pSession->uTracerData;
     1283                    pDevExt->cTracerOpens++;
     1284                    pSession->hTracerCaller = hNativeSelf;
     1285                    RTSemFastMutexRelease(pDevExt->mtxTracer);
     1286
     1287                    rc = pDevExt->pTracerOps->pfnTracerIoCtl(pDevExt->pTracerOps, pSession, uTracerData, uCmd, uArg, piRetVal);
     1288
     1289                    RTSemFastMutexRequest(pDevExt->mtxTracer);
     1290                    pSession->hTracerCaller = NIL_RTNATIVETHREAD;
     1291                    Assert(pDevExt->cTracerOpens > 0);
     1292                    pDevExt->cTracerOpens--;
     1293                }
     1294                else
     1295                    rc = VERR_SUPDRV_TRACER_SESSION_BUSY;
     1296            }
     1297            else
     1298                rc = VERR_SUPDRV_TRACER_UNLOADING;
     1299        }
     1300        else
     1301            rc = VERR_SUPDRV_TRACER_NOT_PRESENT;
     1302    }
     1303    else
     1304        rc = VERR_SUPDRV_TRACER_NOT_OPENED;
     1305
     1306    RTSemFastMutexRelease(pDevExt->mtxTracer);
     1307    return rc;
     1308}
     1309
     1310
     1311/**
    11131312 * Early module initialization hook.
    11141313 *
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