VirtualBox

Ignore:
Timestamp:
Aug 11, 2015 2:39:19 PM (9 years ago)
Author:
vboxsync
Message:

iprt/r0drv/linux: Preserve EFLAGS/AC where ever it may possibly be thought to change when calling kernel code.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/r0drv/linux/timer-r0drv-linux.c

    r56290 r57276  
    11861186    RTTIMERLINUXSTARTONCPUARGS Args;
    11871187    int rc2;
     1188    IPRT_LINUX_SAVE_EFL_AC();
    11881189
    11891190    /*
     
    12031204     */
    12041205    if (pTimer->fAllCpus)
    1205         return rtTimerLnxOmniStart(pTimer, &Args);
     1206    {
     1207        rc2 = rtTimerLnxOmniStart(pTimer, &Args);
     1208        IPRT_LINUX_RESTORE_EFL_AC();
     1209        return rc2;
     1210    }
    12061211#endif
    12071212
     
    12341239                        }
    12351240                    }
     1241                    IPRT_LINUX_RESTORE_EFL_AC();
    12361242                    return VINF_SUCCESS;
    12371243                }
     
    12431249                {
    12441250                    ASMAtomicWriteBool(&pTimer->fSuspended, false);
     1251                    IPRT_LINUX_RESTORE_EFL_AC();
    12451252                    return VINF_SUCCESS;
    12461253                }
     
    12491256            default:
    12501257                AssertMsgFailed(("%d\n", enmState));
     1258                IPRT_LINUX_RESTORE_EFL_AC();
    12511259                return VERR_INTERNAL_ERROR_4;
    12521260        }
     
    13291337     * Validate.
    13301338     */
     1339    IPRT_LINUX_SAVE_EFL_AC();
    13311340    AssertPtrReturn(pTimer, VERR_INVALID_HANDLE);
    13321341    AssertReturn(pTimer->u32Magic == RTTIMER_MAGIC, VERR_INVALID_HANDLE);
     
    13371346
    13381347    rtTimerLnxStop(pTimer, false /*fForDestroy*/);
     1348
     1349    IPRT_LINUX_RESTORE_EFL_AC();
    13391350    return VINF_SUCCESS;
    13401351}
     
    13461357    unsigned long cJiffies;
    13471358    unsigned long flFlags;
     1359    IPRT_LINUX_SAVE_EFL_AC();
    13481360
    13491361    /*
     
    13651377    {
    13661378        ASMAtomicWriteU64(&pTimer->u64NanoInterval, u64NanoInterval);
     1379        IPRT_LINUX_RESTORE_EFL_AC();
    13671380        return VINF_SUCCESS;
    13681381    }
     
    13851398    ASMAtomicWriteU64(&pTimer->u64NanoInterval, u64NanoInterval);
    13861399    spin_unlock_irqrestore(&pTimer->ChgIntLock, flFlags);
     1400    IPRT_LINUX_RESTORE_EFL_AC();
    13871401    return VINF_SUCCESS;
    13881402}
     
    13931407{
    13941408    bool fCanDestroy;
     1409    IPRT_LINUX_SAVE_EFL_AC();
    13951410
    13961411    /*
     
    14601475    }
    14611476
     1477    IPRT_LINUX_RESTORE_EFL_AC();
    14621478    return VINF_SUCCESS;
    14631479}
     
    14711487    unsigned    cCpus;
    14721488    int         rc;
     1489    IPRT_LINUX_SAVE_EFL_AC();
    14731490
    14741491    rtR0LnxWorkqueueFlush();                /* for 2.4 */
     
    14791496     */
    14801497    if (!RTTIMER_FLAGS_ARE_VALID(fFlags))
     1498    {
     1499        IPRT_LINUX_RESTORE_EFL_AC();
    14811500        return VERR_INVALID_PARAMETER;
     1501    }
    14821502    if (    (fFlags & RTTIMER_FLAGS_CPU_SPECIFIC)
    14831503        &&  (fFlags & RTTIMER_FLAGS_CPU_ALL) != RTTIMER_FLAGS_CPU_ALL
    14841504        &&  !RTMpIsCpuPossible(RTMpCpuIdFromSetIndex(fFlags & RTTIMER_FLAGS_CPU_MASK)))
     1505    {
     1506        IPRT_LINUX_RESTORE_EFL_AC();
    14851507        return VERR_CPU_NOT_FOUND;
     1508    }
    14861509
    14871510    /*
     
    14941517        cCpus = RTMpGetMaxCpuId() + 1;
    14951518        Assert(cCpus <= RTCPUSET_MAX_CPUS); /* On linux we have a 1:1 relationship between cpuid and set index. */
    1496         AssertReturn(u64NanoInterval, VERR_NOT_IMPLEMENTED); /* We don't implement single shot on all cpus, sorry. */
     1519        AssertReturnStmt(u64NanoInterval, IPRT_LINUX_RESTORE_EFL_AC(), VERR_NOT_IMPLEMENTED); /* We don't implement single shot on all cpus, sorry. */
    14971520    }
    14981521#endif
     
    15011524                      RTMEMALLOCEX_FLAGS_ZEROED | RTMEMALLOCEX_FLAGS_ANY_CTX_FREE, (void **)&pTimer);
    15021525    if (RT_FAILURE(rc))
     1526    {
     1527        IPRT_LINUX_RESTORE_EFL_AC();
    15031528        return rc;
     1529    }
    15041530
    15051531    /*
     
    15681594        {
    15691595            RTTimerDestroy(pTimer);
     1596            IPRT_LINUX_RESTORE_EFL_AC();
    15701597            return rc;
    15711598        }
     
    15751602    RTTIMERLNX_LOG(("create %p hires=%d fFlags=%#x cCpus=%u\n", pTimer, pTimer->fHighRes, fFlags, cCpus));
    15761603    *ppTimer = pTimer;
     1604    IPRT_LINUX_RESTORE_EFL_AC();
    15771605    return VINF_SUCCESS;
    15781606}
     
    15851613       *        querying the resolution of the high res timers? */
    15861614    struct timespec Ts;
    1587     int rc = hrtimer_get_res(CLOCK_MONOTONIC, &Ts);
     1615    int rc;
     1616    IPRT_LINUX_SAVE_EFL_AC();
     1617    rc = hrtimer_get_res(CLOCK_MONOTONIC, &Ts);
     1618    IPRT_LINUX_RESTORE_EFL_AC();
    15881619    if (!rc)
    15891620    {
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