VirtualBox

Ignore:
Timestamp:
Apr 11, 2012 8:44:41 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
77420
Message:

Working on the 64-bit probe argument issue for 32-bit hosts...

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

Legend:

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

    r40867 r40878  
    397397            {
    398398                memcpy(pArgDesc->dtargd_native, pszType, cchType + 1);
    399                 /** @todo mapping */
     399                /** @todo mapping? */
    400400                pArgDesc->dtargd_ndx = uArg;
    401401                LOG_DTRACE(("supdrvDtPOps_GetArgVal: returns dtargd_native = %s\n", pArgDesc->dtargd_native));
     
    449449    AssertReturn(!pProv->TracerData.DTrace.fZombie, UINT64_MAX);
    450450    AssertPtrReturn(pProv->TracerData.DTrace.idProvider, UINT64_MAX);
     451    PVTGPROBELOC    pProbeLoc = (PVTGPROBELOC)pvProbe;
     452    AssertPtrReturn(pProbeLoc, UINT64_MAX);
     453    PVTGDESCPROBE   pProbe    = (PVTGDESCPROBE)pProbeLoc->pbProbe
     454    AssertPtrReturn(pProbe, UINT64_MAX);
     455    PVTGDESCARGLIST pArgList  = (PVTGDESCPROBE)((uintptr_t)pProv->pHdr->paArgLists + pProbe->offArgList);
     456    AssertPtrReturn(pArgList, UINT64_MAX);
    451457
    452458    /* Locate the caller of probe_dtrace, . */
     
    464470
    465471    /* Get the stack data. */
    466     LOG_DTRACE(("supdrvDtPOps_GetArgVal: returns %#llx\n", (uint64_t)pData->pauStackArgs[iArg - 5]));
    467     return pData->pauStackArgs[iArg - 5];
     472#if ARCH_BITS == 64
     473    uint64_t u64Ret = pData->pauStackArgs[iArg - 5];
     474#else
     475    uint64_t u64Ret;
     476    if (   !pArgList->fHaveLargeArgs
     477        || pArgList->cArgs <= iArg)
     478        u64Ret = pData->pauStackArgs[iArg - 5];
     479    else
     480    {
     481        /* wonder if this will work... */
     482        uint32_t off = 0;
     483        for (uint32_t 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)
     486                off++;
     487        u64Ret = pData->pauStackArgs[iArg - 5 + off];
     488        if (   (pArgList->aArgs[iArg].fType & VTG_TYPE_FIXED_SIZED)
     489            && (pArgList->aArgs[iArg].fType & VTG_TYPE_SIZE_MASK) == 8
     490               u64Ret |= (uint64_t)pData->pauStackArgs[iArg - 5 + off + 1] << 32;
     491    }
     492#endif
     493
     494    LOG_DTRACE(("supdrvDtPOps_GetArgVal: returns %#llx\n", u64Ret));
     495    return u64Ret;
    468496}
    469497
  • trunk/src/VBox/HostDrivers/Support/SUPDrvTracer.cpp

    r40867 r40878  
    299299        PVTGDESCARGLIST pArgList;
    300300        unsigned        iArg;
     301        bool            fHaveLargeArgs;
    301302
    302303        MY_VALIDATE_STR(pVtgHdr->paProbes[i].offName);
     
    319320        if (pArgList->cArgs > 16)
    320321            return VERR_SUPDRV_VTG_BAD_ARGLIST;
     322        if (pArgList->fHaveLargeArgs >= 2)
     323            return VERR_SUPDRV_VTG_BAD_ARGLIST;
    321324        if (   pArgList->abReserved[0]
    322             || pArgList->abReserved[1]
    323             || pArgList->abReserved[2])
     325            || pArgList->abReserved[1])
    324326            return VERR_SUPDRV_VTG_BAD_ARGLIST;
     327        fHaveLargeArgs = false;
    325328        iArg = pArgList->cArgs;
    326329        while (iArg-- > 0)
    327330        {
     331            rc = VINF_SUCCESS;
    328332            MY_VALIDATE_STR(pArgList->aArgs[iArg].offType);
    329             MY_VALIDATE_STR(pArgList->aArgs[iArg].offName);
    330         }
     333            switch (pArgList->aArgs[iArg].fType & VTG_TYPE_SIZE_MASK)
     334            {
     335                case 0:
     336                    if (!(pArgList->aArgs[iArg].fType & VTG_TYPE_FIXED_SIZED))
     337                        rc = VERR_SUPDRV_TRACER_BAD_ARG_FLAGS;
     338                    break;
     339                case 1: case 2: case 4: case 8:
     340                    break;
     341                default:
     342                    rc = VERR_SUPDRV_TRACER_BAD_ARG_FLAGS;
     343            }
     344            if (RT_FAILURE(rc))
     345            {
     346                SUPR0Printf("supdrvVtgValidate: VERR_SUPDRV_TRACER_BAD_ARG_FLAGS - fType=%#x iArg=%u iProbe=%u\n",
     347                            pArgList->aArgs[iArg].fType, iArg, i);
     348                return rc;
     349            }
     350            if (VTG_TYPE_IS_LARGE(pArgList->aArgs[iArg].fType))
     351                fHaveLargeArgs = true;
     352        }
     353        if ((uint8_t)fHaveLargeArgs != pArgList->fHaveLargeArgs)
     354            return VERR_SUPDRV_VTG_BAD_PROBE;
    331355    }
    332356
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