• Nathan Lynch's avatar
    arm64: vdso: fix coarse clock handling · 069b9186
    Nathan Lynch authored
    When __kernel_clock_gettime is called with a CLOCK_MONOTONIC_COARSE or
    CLOCK_REALTIME_COARSE clock id, it returns incorrectly to whatever the
    caller has placed in x2 ("ret x2" to return from the fast path).  Fix
    this by saving x30/LR to x2 only in code that will call
    __do_get_tspec, restoring x30 afterward, and using a plain "ret" to
    return from the routine.
    
    Also: while the resulting tv_nsec value for CLOCK_REALTIME and
    CLOCK_MONOTONIC must be computed using intermediate values that are
    left-shifted by cs_shift (x12, set by __do_get_tspec), the results for
    coarse clocks should be calculated using unshifted values
    (xtime_coarse_nsec is in units of actual nanoseconds).  The current
    code shifts intermediate values by x12 unconditionally, but x12 is
    uninitialized when servicing a coarse clock.  Fix this by setting x12
    to 0 once we know we are dealing with a coarse clock id.
    Signed-off-by: default avatarNathan Lynch <nathan_lynch@mentor.com>
    Acked-by: default avatarWill Deacon <will.deacon@arm.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    069b9186
gettimeofday.S 5.1 KB