VirtualBox

Changeset 85766 in vbox for trunk/src


Ignore:
Timestamp:
Aug 14, 2020 12:27:41 PM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
139917
Message:

SUPDrv: Use symbol_get to resolve dtrace symbols on linux. Needed for 5.7+ and fixes reference issue. (untested) bugref:9733

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

Legend:

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

    r85172 r85766  
    256256#define dtrace_unregister       g_pfnDTraceProviderUnregister
    257257
     258/** For dynamical resolving and releasing.   */
     259static const struct
     260{
     261    const char *pszName;
     262    uintptr_t  *ppfn; /**< @note Clang 11 nothrow weirdness forced this from PFNRT * to uintptr_t *. */
     263} g_aDTraceFunctions[] =
     264{
     265    { "dtrace_probe",        (uintptr_t *)&dtrace_probe        },
     266    { "dtrace_probe_create", (uintptr_t *)&dtrace_probe_create },
     267    { "dtrace_probe_lookup", (uintptr_t *)&dtrace_probe_lookup },
     268    { "dtrace_register",     (uintptr_t *)&dtrace_register     },
     269    { "dtrace_invalidate",   (uintptr_t *)&dtrace_invalidate   },
     270    { "dtrace_unregister",   (uintptr_t *)&dtrace_unregister   },
     271};
     272
    258273/** @} */
    259274#endif
     
    11121127# endif
    11131128
    1114     static const struct
    1115     {
    1116         const char *pszName;
    1117         uintptr_t  *ppfn; /**< @note Clang 11 nothrow weirdness forced this from PFNRT * to uintptr_t *. */
    1118     } s_aDTraceFunctions[] =
    1119     {
    1120         { "dtrace_probe",        (uintptr_t *)&dtrace_probe        },
    1121         { "dtrace_probe_create", (uintptr_t *)&dtrace_probe_create },
    1122         { "dtrace_probe_lookup", (uintptr_t *)&dtrace_probe_lookup },
    1123         { "dtrace_register",     (uintptr_t *)&dtrace_register     },
    1124         { "dtrace_invalidate",   (uintptr_t *)&dtrace_invalidate   },
    1125         { "dtrace_unregister",   (uintptr_t *)&dtrace_unregister   },
    1126     };
    11271129    unsigned i;
    1128     for (i = 0; i < RT_ELEMENTS(s_aDTraceFunctions); i++)
     1130    for (i = 0; i < RT_ELEMENTS(g_aDTraceFunctions); i++)
    11291131    {
    11301132# ifndef RT_OS_LINUX
    1131         rc = RTR0DbgKrnlInfoQuerySymbol(hKrnlInfo, NULL, s_aDTraceFunctions[i].pszName,
    1132                                         (void **)s_aDTraceFunctions[i].ppfn);
     1133        rc = RTR0DbgKrnlInfoQuerySymbol(hKrnlInfo, NULL, g_aDTraceFunctions[i].pszName,
     1134                                        (void **)g_aDTraceFunctions[i].ppfn);
    11331135        if (RT_FAILURE(rc))
    11341136        {
    1135             SUPR0Printf("supdrvDTraceInit: Failed to resolved '%s' (rc=%Rrc, i=%u).\n", s_aDTraceFunctions[i].pszName, rc, i);
     1137            SUPR0Printf("supdrvDTraceInit: Failed to resolved '%s' (rc=%Rrc, i=%u).\n", g_aDTraceFunctions[i].pszName, rc, i);
    11361138            break;
    11371139        }
    1138 # else
    1139         unsigned long ulAddr = kallsyms_lookup_name(s_aDTraceFunctions[i].pszName);
     1140# else /* RT_OS_LINUX */
     1141        uintptr_t ulAddr = (uintptr_t)__symbol_get(g_aDTraceFunctions[i].pszName);
    11401142        if (!ulAddr)
    11411143        {
    1142             SUPR0Printf("supdrvDTraceInit: Failed to resolved '%s' (i=%u).\n", s_aDTraceFunctions[i].pszName, i);
     1144            SUPR0Printf("supdrvDTraceInit: Failed to resolved '%s' (i=%u).\n", g_aDTraceFunctions[i].pszName, i);
     1145            while (i-- > 0)
     1146            {
     1147                __symbol_put(g_aDTraceFunctions[i].pszName);
     1148                *g_aDTraceFunctions[i].ppfn = NULL;
     1149            }
    11431150            return NULL;
    11441151        }
    1145         *s_aDTraceFunctions[i].ppfn = (PFNRT)ulAddr;
    1146 # endif
     1152        *g_aDTraceFunctions[i].ppfn = (PFNRT)ulAddr;
     1153# endif /* RT_OS_LINUX */
    11471154    }
    11481155
     
    11511158    if (RT_FAILURE(rc))
    11521159        return NULL;
    1153 # else
    1154     /** @todo grab a reference to the dtrace module... */
    11551160# endif
    11561161#endif
    11571162
    11581163    return &g_VBoxDTraceReg;
     1164}
     1165
     1166/**
     1167 * Module teardown code.
     1168 */
     1169void VBOXCALL supdrvDTraceFini(void)
     1170{
     1171#ifdef RT_OS_LINUX
     1172    /* Release the references. */
     1173    unsigned i;
     1174    for (i = 0; i < RT_ELEMENTS(g_aDTraceFunctions); i++)
     1175        if (*g_aDTraceFunctions[i].ppfn)
     1176        {
     1177            __symbol_put(g_aDTraceFunctions[i].pszName);
     1178            *g_aDTraceFunctions[i].ppfn = NULL;
     1179        }
     1180#endif
    11591181}
    11601182
  • trunk/src/VBox/HostDrivers/Support/SUPDrvInternal.h

    r85698 r85766  
    11081108#ifdef VBOX_WITH_NATIVE_DTRACE
    11091109const SUPDRVTRACERREG * VBOXCALL supdrvDTraceInit(void);
     1110void                    VBOXCALL supdrvDTraceFini(void);
    11101111#endif
    11111112
  • trunk/src/VBox/HostDrivers/Support/SUPDrvTracer.cpp

    r85606 r85766  
    24692469
    24702470    supdrvTracerRemoveAllProviders(pDevExt);
    2471 
     2471#ifdef VBOX_WITH_NATIVE_DTRACE
     2472    supdrvDTraceFini();
     2473#endif
    24722474    RTSemFastMutexDestroy(pDevExt->mtxTracer);
    24732475    pDevExt->mtxTracer = NIL_RTSEMFASTMUTEX;
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