cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

gettimeofday.h (2363B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * Copyright (C) 2018 ARM Limited
      4 */
      5#ifndef __ASM_VDSO_GETTIMEOFDAY_H
      6#define __ASM_VDSO_GETTIMEOFDAY_H
      7
      8#ifndef __ASSEMBLY__
      9
     10#include <asm/barrier.h>
     11#include <asm/unistd.h>
     12
     13#define VDSO_HAS_CLOCK_GETRES		1
     14
     15static __always_inline
     16int gettimeofday_fallback(struct __kernel_old_timeval *_tv,
     17			  struct timezone *_tz)
     18{
     19	register struct timezone *tz asm("x1") = _tz;
     20	register struct __kernel_old_timeval *tv asm("x0") = _tv;
     21	register long ret asm ("x0");
     22	register long nr asm("x8") = __NR_gettimeofday;
     23
     24	asm volatile(
     25	"       svc #0\n"
     26	: "=r" (ret)
     27	: "r" (tv), "r" (tz), "r" (nr)
     28	: "memory");
     29
     30	return ret;
     31}
     32
     33static __always_inline
     34long clock_gettime_fallback(clockid_t _clkid, struct __kernel_timespec *_ts)
     35{
     36	register struct __kernel_timespec *ts asm("x1") = _ts;
     37	register clockid_t clkid asm("x0") = _clkid;
     38	register long ret asm ("x0");
     39	register long nr asm("x8") = __NR_clock_gettime;
     40
     41	asm volatile(
     42	"       svc #0\n"
     43	: "=r" (ret)
     44	: "r" (clkid), "r" (ts), "r" (nr)
     45	: "memory");
     46
     47	return ret;
     48}
     49
     50static __always_inline
     51int clock_getres_fallback(clockid_t _clkid, struct __kernel_timespec *_ts)
     52{
     53	register struct __kernel_timespec *ts asm("x1") = _ts;
     54	register clockid_t clkid asm("x0") = _clkid;
     55	register long ret asm ("x0");
     56	register long nr asm("x8") = __NR_clock_getres;
     57
     58	asm volatile(
     59	"       svc #0\n"
     60	: "=r" (ret)
     61	: "r" (clkid), "r" (ts), "r" (nr)
     62	: "memory");
     63
     64	return ret;
     65}
     66
     67static __always_inline u64 __arch_get_hw_counter(s32 clock_mode,
     68						 const struct vdso_data *vd)
     69{
     70	u64 res;
     71
     72	/*
     73	 * Core checks for mode already, so this raced against a concurrent
     74	 * update. Return something. Core will do another round and then
     75	 * see the mode change and fallback to the syscall.
     76	 */
     77	if (clock_mode == VDSO_CLOCKMODE_NONE)
     78		return 0;
     79
     80	/*
     81	 * This isb() is required to prevent that the counter value
     82	 * is speculated.
     83	 */
     84	isb();
     85	asm volatile("mrs %0, cntvct_el0" : "=r" (res) :: "memory");
     86	arch_counter_enforce_ordering(res);
     87
     88	return res;
     89}
     90
     91static __always_inline
     92const struct vdso_data *__arch_get_vdso_data(void)
     93{
     94	return _vdso_data;
     95}
     96
     97#ifdef CONFIG_TIME_NS
     98static __always_inline
     99const struct vdso_data *__arch_get_timens_vdso_data(const struct vdso_data *vd)
    100{
    101	return _timens_data;
    102}
    103#endif
    104
    105#endif /* !__ASSEMBLY__ */
    106
    107#endif /* __ASM_VDSO_GETTIMEOFDAY_H */