diff options
| -rw-r--r-- | arch/arm64/kernel/vdso/gettimeofday.S | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/arch/arm64/kernel/vdso/gettimeofday.S b/arch/arm64/kernel/vdso/gettimeofday.S index efa79e8d4196..9f8eeccae67c 100644 --- a/arch/arm64/kernel/vdso/gettimeofday.S +++ b/arch/arm64/kernel/vdso/gettimeofday.S @@ -216,16 +216,25 @@ ENDPROC(__kernel_clock_getres) ENTRY(__do_get_tspec) .cfi_startproc + /* Read the virtual counter. */ + isb +#if IS_ENABLED(CONFIG_MSM_TIMER_LEAP) +#define LEAST_32BITS 0x00000000FFFFFFFF +reread: + mrs x15, cntvct_el0 + and x13, x15, #LEAST_32BITS + eor x13, x13, #LEAST_32BITS + cbz x13, reread +#else + mrs x15, cntvct_el0 +#endif + /* Read from the vDSO data page. */ ldr x10, [vdso_data, #VDSO_CS_CYCLE_LAST] ldp x13, x14, [vdso_data, #VDSO_XTIME_CLK_SEC] ldp w11, w12, [vdso_data, #VDSO_CS_MULT] seqcnt_read w9 - /* Read the virtual counter. */ - isb - mrs x15, cntvct_el0 - /* Calculate cycle delta and convert to ns. */ sub x10, x15, x10 /* We can only guarantee 56 bits of precision. */ |
