VirtualBox

Changeset 40892 in vbox


Ignore:
Timestamp:
Apr 12, 2012 12:12:40 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
77434
Message:

64-bit probe arguments (on mac)

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/VBoxTpG.h

    r40886 r40892  
    170170    uint16_t        idxEnabled;
    171171    uint16_t        idxProvider;
     172    /** The distance from this structure to the VTG object header. */
     173    int32_t         offObjHdr;
    172174    uint32_t        u32User;
     175    uint32_t        u32User2;
    173176} VTGDESCPROBE;
    174 AssertCompileSize(VTGDESCPROBE, 16);
     177AssertCompileSize(VTGDESCPROBE, 24);
    175178/** Pointer to a VTG probe descriptor. */
    176179typedef VTGDESCPROBE       *PVTGDESCPROBE;
     
    269272
    270273/** The current VTGOBJHDR::szMagic value. */
    271 #define VTGOBJHDR_MAGIC     "VTG Object Header v1.3\0"
     274#define VTGOBJHDR_MAGIC     "VTG Object Header v1.4\0"
    272275
    273276/** The name of the VTG data object header symbol in the object file. */
  • trunk/src/VBox/HostDrivers/Support/SUPDrv-dtrace.cpp

    r40889 r40892  
    399399                /** @todo mapping? */
    400400                pArgDesc->dtargd_ndx = uArg;
     401SUPR0Printf("supdrvDtPOps_GetArgVal: returns dtargd_native = %s for #%u\n", pArgDesc->dtargd_native, uArg);
    401402                LOG_DTRACE(("supdrvDtPOps_GetArgVal: returns dtargd_native = %s\n", pArgDesc->dtargd_native));
    402403                return;
     
    404405        }
    405406    }
     407SUPR0Printf("supdrvDtPOps_GetArgVal: returns faiure for #%u\n", uArg);
    406408}
    407409
     
    469471    }
    470472
    471     /* Get the stack data. */
     473    /*
     474     * Get the stack data. This is a wee bit complicated on 32-bit systems
     475     * since we want to support 64-bit integer arguments.
     476     */
    472477#if ARCH_BITS == 64
    473478    uint64_t u64Ret = pData->pauStackArgs[iArg - 5];
     
    479484    else
    480485    {
    481         /* wonder if this will work... */
     486        /* Similar to what we did for mac in when calling dtrace_probe(). */
    482487        uint32_t off = 0;
    483488        for (int i = 5; i < iArg; i++)
    484             if (   (pArgList->aArgs[i].fType & VTG_TYPE_FIXED_SIZED)
    485                 && (pArgList->aArgs[i].fType & VTG_TYPE_SIZE_MASK) == 8)
     489            if (VTG_TYPE_IS_LARGE(pArgList->aArgs[iArg].fType))
    486490                off++;
    487491        u64Ret = pData->pauStackArgs[iArg - 5 + off];
     
    566570    SUPDRVDT_SETUP_STACK_DATA();
    567571
    568     pStackData->pauStackArgs = &uArg4 + 1;
     572    pStackData->pauStackArgs  = &uArg4 + 1;
     573
     574#if defined(RT_OS_DARWIN) && ARCH_BITS == 32
     575    /*
     576     * Convert arguments from uintptr_t to uint64_t.
     577     */
     578    PVTGDESCPROBE   pProbe   = (PVTGDESCPROBE)((PVTGPROBELOC)pVtgProbeLoc)->pbProbe;
     579    AssertPtrReturnVoid(pProbe);
     580    PVTGOBJHDR      pVtgHdr  = (PVTGOBJHDR)((uintptr_t)pProbe + pProbe->offObjHdr);
     581    AssertPtrReturnVoid(pVtgHdr);
     582    PVTGDESCARGLIST pArgList = (PVTGDESCARGLIST)((uintptr_t)pVtgHdr->paArgLists + pProbe->offArgList);
     583    AssertPtrReturnVoid(pArgList);
     584    if (!pArgList->fHaveLargeArgs)
     585        dtrace_probe(pVtgProbeLoc->idProbe, uArg0, uArg1, uArg2, uArg3, uArg4);
     586    else
     587    {
     588        uintptr_t *auSrcArgs = &uArg0;
     589        uint32_t   iSrcArg   = 0;
     590        uint32_t   iDstArg   = 0;
     591        uint64_t   au64DstArgs[5];
     592
     593        while (   iDstArg < RT_ELEMENTS(au64DstArgs)
     594               && iSrcArg < pArgList->cArgs)
     595        {
     596            au64DstArgs[iDstArg] = auSrcArgs[iSrcArg];
     597            if (VTG_TYPE_IS_LARGE(pArgList->aArgs[iDstArg].fType))
     598                au64DstArgs[iDstArg] |= (uint64_t)auSrcArgs[++iSrcArg] << 32;
     599            iSrcArg++;
     600            iDstArg++;
     601        }
     602        while (iDstArg < RT_ELEMENTS(au64DstArgs))
     603            au64DstArgs[iDstArg++] = auSrcArgs[iSrcArg++];
     604
     605        pStackData->pauStackArgs  = &auSrcArgs[iSrcArg];
     606        dtrace_probe(pVtgProbeLoc->idProbe, au64DstArgs[0], au64DstArgs[1], au64DstArgs[2], au64DstArgs[3], au64DstArgs[4]);
     607    }
     608#else
    569609    dtrace_probe(pVtgProbeLoc->idProbe, uArg0, uArg1, uArg2, uArg3, uArg4);
     610#endif
    570611
    571612    SUPDRVDT_CLEAR_STACK_DATA();
  • trunk/src/VBox/HostDrivers/Support/SUPDrvTracer.cpp

    r40886 r40892  
    315315        if (pVtgHdr->paProbes[i].u32User)
    316316            return VERR_SUPDRV_VTG_BAD_PROBE;
     317        if (pVtgHdr->paProbes[i].u32User2)
     318            return VERR_SUPDRV_VTG_BAD_PROBE;
     319        if (   pVtgHdr->paProbes[i].offObjHdr
     320            != (intptr_t)pVtgHdr - (intptr_t)&pVtgHdr->paProbes[i])
     321        {
     322            SUPR0Printf("supdrvVtgValidate: VERR_SUPDRV_TRACER_BAD_ARG_FLAGS - iProbe=%u offObjHdr=%d expected %zd\n",
     323                        i, pVtgHdr->paProbes[i].offObjHdr, (intptr_t)pVtgHdr - (intptr_t)&pVtgHdr->paProbes[i]);
     324            return VERR_SUPDRV_VTG_BAD_PROBE;
     325        }
    317326
    318327        /* The referenced argument list. */
     
    320329        if (pArgList->cArgs > 16)
    321330        {
    322             SUPR0Printf("supdrvVtgValidate: VERR_SUPDRV_TRACER_BAD_ARG_FLAGS - iProbe=%u cArgs=%u\n", i, pArgList->fHaveLargeArgs, pArgList->cArgs);
     331            SUPR0Printf("supdrvVtgValidate: VERR_SUPDRV_TRACER_BAD_ARG_FLAGS - iProbe=%u cArgs=%u\n", i, pArgList->cArgs);
    323332            return VERR_SUPDRV_VTG_BAD_ARGLIST;
    324333        }
  • trunk/src/bldprogs/VBoxTpG.cpp

    r40887 r40892  
    516516                    "                ;0         1         2         3\n"
    517517                    "                ;012345678901234567890123456789012\n"
    518                     "    db          'VTG Object Header v1.3', 0, 0\n"
     518                    "    db          'VTG Object Header v1.4', 0, 0\n"
    519519                    "    dd          %u\n"
    520520                    "    dd          0\n"
     
    607607            ScmStreamPrintf(pStrm,
    608608                            "    ; off=%u\n"
    609                             "    db   %2u     ; Argument count\n"
    610                             "    db   %u      ; fHaveLargeArgs\n"
    611                             "    db  0, 0    ; Reserved\n"
     609                            "    db        %2u  ; Argument count\n"
     610                            "    db         %u  ; fHaveLargeArgs\n"
     611                            "    db      0, 0  ; Reserved\n"
    612612                            , off, pProbe->cArgs, (int)pProbe->fHaveLargeArgs);
    613613            off += 4;
     
    615615            {
    616616                ScmStreamPrintf(pStrm,
    617                                 "    dd %6u   ; type '%s' (name '%s')\n"
     617                                "    dd  %8u  ; type '%s' (name '%s')\n"
    618618                                "    dd 0%08xh ; type flags\n",
    619619                                strtabGetOff(pArg->pszType), pArg->pszType, pArg->pszName,
     
    679679                            "    dw NAME(g_fVTGProbeEnabled_%s_%s) - NAME(g_afVTGProbeEnabled)\n"
    680680                            "    dw %6u  ; provider index\n"
    681                             "    dd 0       ; for the application\n"
     681                            "    dd NAME(g_VTGObjHeader) - NAME(g_VTGProbeData_%s_%s) ; offset to the object header\n"
     682                            "    dd      0  ; for the application\n"
     683                            "    dd      0  ; for the application\n"
    682684                            ,
    683685                            pProvider->pszName, pProbe->pszMangledName, iProbe,
     
    685687                            pProbe->offArgList,
    686688                            pProvider->pszName, pProbe->pszMangledName,
    687                             iProvider);
     689                            iProvider,
     690                            pProvider->pszName, pProbe->pszMangledName
     691                            );
    688692            pProbe->iProbe = iProbe;
    689693            iProbe++;
     
    974978            RTListForEach(&pProbe->ArgHead, pArg, VTGARG, ListEntry)
    975979            {
    976                 if (iArg < 5)
    977                 {
    978                     if (pArg->fType & VTG_TYPE_FIXED_SIZED)
    979                         ScmStreamPrintf(pStrm,
    980                                         "        /*AssertCompile(sizeof(%s) <= sizeof(uint32_t));*/ \\\n"
    981                                         "        /*AssertCompile(sizeof(%s) <= sizeof(uint32_t));*/ \\\n",
    982                                         pArg->pszName,
    983                                         pArg->pszType);
    984                     else
    985                         ScmStreamPrintf(pStrm,
    986                                         "        AssertCompile(sizeof(%s) <= sizeof(uintptr_t)); \\\n"
    987                                         "        AssertCompile(sizeof(%s) <= sizeof(uintptr_t)); \\\n",
    988                                         pArg->pszName,
    989                                         pArg->pszType);
    990                 }
     980                if (pArg->fType & VTG_TYPE_FIXED_SIZED)
     981                    ScmStreamPrintf(pStrm,
     982                                    "        AssertCompile(sizeof(%s) == %u); \\\n"
     983                                    "        AssertCompile(sizeof(%s) <= %u); \\\n",
     984                                    pArg->pszType, pArg->fType & VTG_TYPE_SIZE_MASK,
     985                                    pArg->pszName, pArg->fType & VTG_TYPE_SIZE_MASK);
     986                else if (pArg->fType & (VTG_TYPE_POINTER | VTG_TYPE_HC_ARCH_SIZED))
     987                    ScmStreamPrintf(pStrm,
     988                                    "        AssertCompile(sizeof(%s) <= sizeof(uintptr_t)); \\\n"
     989                                    "        AssertCompile(sizeof(%s) <= sizeof(uintptr_t)); \\\n",
     990                                    pArg->pszName,
     991                                    pArg->pszType);
    991992                iArg++;
    992993            }
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