VirtualBox

Ignore:
Timestamp:
Nov 4, 2016 7:08:09 PM (8 years ago)
Author:
vboxsync
Message:

SUPDrv-dtrace.cpp: the dtrace_register/invalidate/unregister APIs could perhaps mess up the AC flag, so safe+restore flags.

File:
1 edited

Legend:

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

    r63510 r64584  
    108108
    109109
     110/** @name Macros for preserving EFLAGS.AC (despair / paranoid)
     111 * @remarks We have to restore it unconditionally on darwin.
     112 * @{ */
     113#if defined(RT_OS_DARWIN) \
     114 || (    defined(RT_OS_LINUX) \
     115     && (defined(CONFIG_X86_SMAP) || defined(RT_STRICT) || defined(IPRT_WITH_EFLAGS_AC_PRESERVING) ) )
     116# include <iprt/asm-amd64-x86.h>
     117# include <iprt/x86.h>
     118# define SUPDRV_SAVE_EFL_AC()          RTCCUINTREG const fSavedEfl = ASMGetFlags();
     119# define SUPDRV_RESTORE_EFL_AC()       ASMSetFlags(fSavedEfl)
     120# define SUPDRV_RESTORE_EFL_ONLY_AC()  ASMChangeFlags(~X86_EFL_AC, fSavedEfl & X86_EFL_AC)
     121#else
     122# define SUPDRV_SAVE_EFL_AC()          do { } while (0)
     123# define SUPDRV_RESTORE_EFL_AC()       do { } while (0)
     124# define SUPDRV_RESTORE_EFL_ONLY_AC()  do { } while (0)
     125#endif
     126/** @} */
     127
     128
    110129/*********************************************************************************************************************************
    111130*   Structures and Typedefs                                                                                                      *
     
    773792    AssertPtrReturnVoid(pVtgProbeLoc->pszFunction);
    774793
     794    SUPDRV_SAVE_EFL_AC();
    775795    VBDT_SETUP_STACK_DATA(kVBoxDtCaller_ProbeFireKernel);
    776796
     
    816836
    817837    VBDT_CLEAR_STACK_DATA();
     838    SUPDRV_RESTORE_EFL_AC();
    818839    LOG_DTRACE(("%s: returns\n", __FUNCTION__));
    819840}
     
    831852    AssertPtrReturnVoid(pVtgHdr);
    832853
     854    SUPDRV_SAVE_EFL_AC();
    833855    VBDT_SETUP_STACK_DATA(kVBoxDtCaller_ProbeFireUser);
    834856
     
    900922
    901923    VBDT_CLEAR_STACK_DATA();
     924    SUPDRV_RESTORE_EFL_AC();
    902925    LOG_DTRACE(("%s: returns\n", __FUNCTION__));
    903926}
     
    958981             have to point it to pCore->TracerData.DTrace.idProvider. */
    959982    AssertCompile(sizeof(dtrace_provider_id_t) == sizeof(pCore->TracerData.DTrace.idProvider));
     983    SUPDRV_SAVE_EFL_AC();
    960984    int rc = dtrace_register(pCore->pszName,
    961985                             &DtAttrs,
     
    965989                             pCore,
    966990                             &pCore->TracerData.DTrace.idProvider);
     991    SUPDRV_RESTORE_EFL_AC();
    967992    if (!rc)
    968993    {
     
    9921017    AssertPtrReturn(idProvider, VERR_INTERNAL_ERROR_3);
    9931018
     1019    SUPDRV_SAVE_EFL_AC();
    9941020    dtrace_invalidate(idProvider);
    9951021    int rc = dtrace_unregister(idProvider);
     1022    SUPDRV_RESTORE_EFL_AC();
    9961023    if (!rc)
    9971024    {
     
    10221049    Assert(pCore->TracerData.DTrace.fZombie);
    10231050
     1051    SUPDRV_SAVE_EFL_AC();
    10241052    int rc = dtrace_unregister(idProvider);
     1053    SUPDRV_RESTORE_EFL_AC();
    10251054    if (!rc)
    10261055    {
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