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

timex.h (1859B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * Copyright (C) 2012 Regents of the University of California
      4 */
      5
      6#ifndef _ASM_RISCV_TIMEX_H
      7#define _ASM_RISCV_TIMEX_H
      8
      9#include <asm/csr.h>
     10
     11typedef unsigned long cycles_t;
     12
     13#ifdef CONFIG_RISCV_M_MODE
     14
     15#include <asm/clint.h>
     16
     17#ifdef CONFIG_64BIT
     18static inline cycles_t get_cycles(void)
     19{
     20	return readq_relaxed(clint_time_val);
     21}
     22#else /* !CONFIG_64BIT */
     23static inline u32 get_cycles(void)
     24{
     25	return readl_relaxed(((u32 *)clint_time_val));
     26}
     27#define get_cycles get_cycles
     28
     29static inline u32 get_cycles_hi(void)
     30{
     31	return readl_relaxed(((u32 *)clint_time_val) + 1);
     32}
     33#define get_cycles_hi get_cycles_hi
     34#endif /* CONFIG_64BIT */
     35
     36/*
     37 * Much like MIPS, we may not have a viable counter to use at an early point
     38 * in the boot process. Unfortunately we don't have a fallback, so instead
     39 * we just return 0.
     40 */
     41static inline unsigned long random_get_entropy(void)
     42{
     43	if (unlikely(clint_time_val == NULL))
     44		return random_get_entropy_fallback();
     45	return get_cycles();
     46}
     47#define random_get_entropy()	random_get_entropy()
     48
     49#else /* CONFIG_RISCV_M_MODE */
     50
     51static inline cycles_t get_cycles(void)
     52{
     53	return csr_read(CSR_TIME);
     54}
     55#define get_cycles get_cycles
     56
     57static inline u32 get_cycles_hi(void)
     58{
     59	return csr_read(CSR_TIMEH);
     60}
     61#define get_cycles_hi get_cycles_hi
     62
     63#endif /* !CONFIG_RISCV_M_MODE */
     64
     65#ifdef CONFIG_64BIT
     66static inline u64 get_cycles64(void)
     67{
     68	return get_cycles();
     69}
     70#else /* CONFIG_64BIT */
     71static inline u64 get_cycles64(void)
     72{
     73	u32 hi, lo;
     74
     75	do {
     76		hi = get_cycles_hi();
     77		lo = get_cycles();
     78	} while (hi != get_cycles_hi());
     79
     80	return ((u64)hi << 32) | lo;
     81}
     82#endif /* CONFIG_64BIT */
     83
     84#define ARCH_HAS_READ_CURRENT_TIMER
     85static inline int read_current_timer(unsigned long *timer_val)
     86{
     87	*timer_val = get_cycles();
     88	return 0;
     89}
     90
     91extern void time_init(void);
     92
     93#endif /* _ASM_RISCV_TIMEX_H */