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

jiffies.h (15431B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef _LINUX_JIFFIES_H
      3#define _LINUX_JIFFIES_H
      4
      5#include <linux/cache.h>
      6#include <linux/limits.h>
      7#include <linux/math64.h>
      8#include <linux/minmax.h>
      9#include <linux/types.h>
     10#include <linux/time.h>
     11#include <linux/timex.h>
     12#include <vdso/jiffies.h>
     13#include <asm/param.h>			/* for HZ */
     14#include <generated/timeconst.h>
     15
     16/*
     17 * The following defines establish the engineering parameters of the PLL
     18 * model. The HZ variable establishes the timer interrupt frequency, 100 Hz
     19 * for the SunOS kernel, 256 Hz for the Ultrix kernel and 1024 Hz for the
     20 * OSF/1 kernel. The SHIFT_HZ define expresses the same value as the
     21 * nearest power of two in order to avoid hardware multiply operations.
     22 */
     23#if HZ >= 12 && HZ < 24
     24# define SHIFT_HZ	4
     25#elif HZ >= 24 && HZ < 48
     26# define SHIFT_HZ	5
     27#elif HZ >= 48 && HZ < 96
     28# define SHIFT_HZ	6
     29#elif HZ >= 96 && HZ < 192
     30# define SHIFT_HZ	7
     31#elif HZ >= 192 && HZ < 384
     32# define SHIFT_HZ	8
     33#elif HZ >= 384 && HZ < 768
     34# define SHIFT_HZ	9
     35#elif HZ >= 768 && HZ < 1536
     36# define SHIFT_HZ	10
     37#elif HZ >= 1536 && HZ < 3072
     38# define SHIFT_HZ	11
     39#elif HZ >= 3072 && HZ < 6144
     40# define SHIFT_HZ	12
     41#elif HZ >= 6144 && HZ < 12288
     42# define SHIFT_HZ	13
     43#else
     44# error Invalid value of HZ.
     45#endif
     46
     47/* Suppose we want to divide two numbers NOM and DEN: NOM/DEN, then we can
     48 * improve accuracy by shifting LSH bits, hence calculating:
     49 *     (NOM << LSH) / DEN
     50 * This however means trouble for large NOM, because (NOM << LSH) may no
     51 * longer fit in 32 bits. The following way of calculating this gives us
     52 * some slack, under the following conditions:
     53 *   - (NOM / DEN) fits in (32 - LSH) bits.
     54 *   - (NOM % DEN) fits in (32 - LSH) bits.
     55 */
     56#define SH_DIV(NOM,DEN,LSH) (   (((NOM) / (DEN)) << (LSH))              \
     57                             + ((((NOM) % (DEN)) << (LSH)) + (DEN) / 2) / (DEN))
     58
     59/* LATCH is used in the interval timer and ftape setup. */
     60#define LATCH ((CLOCK_TICK_RATE + HZ/2) / HZ)	/* For divider */
     61
     62extern int register_refined_jiffies(long clock_tick_rate);
     63
     64/* TICK_USEC is the time between ticks in usec assuming SHIFTED_HZ */
     65#define TICK_USEC ((USEC_PER_SEC + HZ/2) / HZ)
     66
     67/* USER_TICK_USEC is the time between ticks in usec assuming fake USER_HZ */
     68#define USER_TICK_USEC ((1000000UL + USER_HZ/2) / USER_HZ)
     69
     70#ifndef __jiffy_arch_data
     71#define __jiffy_arch_data
     72#endif
     73
     74/*
     75 * The 64-bit value is not atomic - you MUST NOT read it
     76 * without sampling the sequence number in jiffies_lock.
     77 * get_jiffies_64() will do this for you as appropriate.
     78 */
     79extern u64 __cacheline_aligned_in_smp jiffies_64;
     80extern unsigned long volatile __cacheline_aligned_in_smp __jiffy_arch_data jiffies;
     81
     82#if (BITS_PER_LONG < 64)
     83u64 get_jiffies_64(void);
     84#else
     85static inline u64 get_jiffies_64(void)
     86{
     87	return (u64)jiffies;
     88}
     89#endif
     90
     91/*
     92 *	These inlines deal with timer wrapping correctly. You are 
     93 *	strongly encouraged to use them
     94 *	1. Because people otherwise forget
     95 *	2. Because if the timer wrap changes in future you won't have to
     96 *	   alter your driver code.
     97 *
     98 * time_after(a,b) returns true if the time a is after time b.
     99 *
    100 * Do this with "<0" and ">=0" to only test the sign of the result. A
    101 * good compiler would generate better code (and a really good compiler
    102 * wouldn't care). Gcc is currently neither.
    103 */
    104#define time_after(a,b)		\
    105	(typecheck(unsigned long, a) && \
    106	 typecheck(unsigned long, b) && \
    107	 ((long)((b) - (a)) < 0))
    108#define time_before(a,b)	time_after(b,a)
    109
    110#define time_after_eq(a,b)	\
    111	(typecheck(unsigned long, a) && \
    112	 typecheck(unsigned long, b) && \
    113	 ((long)((a) - (b)) >= 0))
    114#define time_before_eq(a,b)	time_after_eq(b,a)
    115
    116/*
    117 * Calculate whether a is in the range of [b, c].
    118 */
    119#define time_in_range(a,b,c) \
    120	(time_after_eq(a,b) && \
    121	 time_before_eq(a,c))
    122
    123/*
    124 * Calculate whether a is in the range of [b, c).
    125 */
    126#define time_in_range_open(a,b,c) \
    127	(time_after_eq(a,b) && \
    128	 time_before(a,c))
    129
    130/* Same as above, but does so with platform independent 64bit types.
    131 * These must be used when utilizing jiffies_64 (i.e. return value of
    132 * get_jiffies_64() */
    133#define time_after64(a,b)	\
    134	(typecheck(__u64, a) &&	\
    135	 typecheck(__u64, b) && \
    136	 ((__s64)((b) - (a)) < 0))
    137#define time_before64(a,b)	time_after64(b,a)
    138
    139#define time_after_eq64(a,b)	\
    140	(typecheck(__u64, a) && \
    141	 typecheck(__u64, b) && \
    142	 ((__s64)((a) - (b)) >= 0))
    143#define time_before_eq64(a,b)	time_after_eq64(b,a)
    144
    145#define time_in_range64(a, b, c) \
    146	(time_after_eq64(a, b) && \
    147	 time_before_eq64(a, c))
    148
    149/*
    150 * These four macros compare jiffies and 'a' for convenience.
    151 */
    152
    153/* time_is_before_jiffies(a) return true if a is before jiffies */
    154#define time_is_before_jiffies(a) time_after(jiffies, a)
    155#define time_is_before_jiffies64(a) time_after64(get_jiffies_64(), a)
    156
    157/* time_is_after_jiffies(a) return true if a is after jiffies */
    158#define time_is_after_jiffies(a) time_before(jiffies, a)
    159#define time_is_after_jiffies64(a) time_before64(get_jiffies_64(), a)
    160
    161/* time_is_before_eq_jiffies(a) return true if a is before or equal to jiffies*/
    162#define time_is_before_eq_jiffies(a) time_after_eq(jiffies, a)
    163#define time_is_before_eq_jiffies64(a) time_after_eq64(get_jiffies_64(), a)
    164
    165/* time_is_after_eq_jiffies(a) return true if a is after or equal to jiffies*/
    166#define time_is_after_eq_jiffies(a) time_before_eq(jiffies, a)
    167#define time_is_after_eq_jiffies64(a) time_before_eq64(get_jiffies_64(), a)
    168
    169/*
    170 * Have the 32 bit jiffies value wrap 5 minutes after boot
    171 * so jiffies wrap bugs show up earlier.
    172 */
    173#define INITIAL_JIFFIES ((unsigned long)(unsigned int) (-300*HZ))
    174
    175/*
    176 * Change timeval to jiffies, trying to avoid the
    177 * most obvious overflows..
    178 *
    179 * And some not so obvious.
    180 *
    181 * Note that we don't want to return LONG_MAX, because
    182 * for various timeout reasons we often end up having
    183 * to wait "jiffies+1" in order to guarantee that we wait
    184 * at _least_ "jiffies" - so "jiffies+1" had better still
    185 * be positive.
    186 */
    187#define MAX_JIFFY_OFFSET ((LONG_MAX >> 1)-1)
    188
    189extern unsigned long preset_lpj;
    190
    191/*
    192 * We want to do realistic conversions of time so we need to use the same
    193 * values the update wall clock code uses as the jiffies size.  This value
    194 * is: TICK_NSEC (which is defined in timex.h).  This
    195 * is a constant and is in nanoseconds.  We will use scaled math
    196 * with a set of scales defined here as SEC_JIFFIE_SC,  USEC_JIFFIE_SC and
    197 * NSEC_JIFFIE_SC.  Note that these defines contain nothing but
    198 * constants and so are computed at compile time.  SHIFT_HZ (computed in
    199 * timex.h) adjusts the scaling for different HZ values.
    200
    201 * Scaled math???  What is that?
    202 *
    203 * Scaled math is a way to do integer math on values that would,
    204 * otherwise, either overflow, underflow, or cause undesired div
    205 * instructions to appear in the execution path.  In short, we "scale"
    206 * up the operands so they take more bits (more precision, less
    207 * underflow), do the desired operation and then "scale" the result back
    208 * by the same amount.  If we do the scaling by shifting we avoid the
    209 * costly mpy and the dastardly div instructions.
    210
    211 * Suppose, for example, we want to convert from seconds to jiffies
    212 * where jiffies is defined in nanoseconds as NSEC_PER_JIFFIE.  The
    213 * simple math is: jiff = (sec * NSEC_PER_SEC) / NSEC_PER_JIFFIE; We
    214 * observe that (NSEC_PER_SEC / NSEC_PER_JIFFIE) is a constant which we
    215 * might calculate at compile time, however, the result will only have
    216 * about 3-4 bits of precision (less for smaller values of HZ).
    217 *
    218 * So, we scale as follows:
    219 * jiff = (sec) * (NSEC_PER_SEC / NSEC_PER_JIFFIE);
    220 * jiff = ((sec) * ((NSEC_PER_SEC * SCALE)/ NSEC_PER_JIFFIE)) / SCALE;
    221 * Then we make SCALE a power of two so:
    222 * jiff = ((sec) * ((NSEC_PER_SEC << SCALE)/ NSEC_PER_JIFFIE)) >> SCALE;
    223 * Now we define:
    224 * #define SEC_CONV = ((NSEC_PER_SEC << SCALE)/ NSEC_PER_JIFFIE))
    225 * jiff = (sec * SEC_CONV) >> SCALE;
    226 *
    227 * Often the math we use will expand beyond 32-bits so we tell C how to
    228 * do this and pass the 64-bit result of the mpy through the ">> SCALE"
    229 * which should take the result back to 32-bits.  We want this expansion
    230 * to capture as much precision as possible.  At the same time we don't
    231 * want to overflow so we pick the SCALE to avoid this.  In this file,
    232 * that means using a different scale for each range of HZ values (as
    233 * defined in timex.h).
    234 *
    235 * For those who want to know, gcc will give a 64-bit result from a "*"
    236 * operator if the result is a long long AND at least one of the
    237 * operands is cast to long long (usually just prior to the "*" so as
    238 * not to confuse it into thinking it really has a 64-bit operand,
    239 * which, buy the way, it can do, but it takes more code and at least 2
    240 * mpys).
    241
    242 * We also need to be aware that one second in nanoseconds is only a
    243 * couple of bits away from overflowing a 32-bit word, so we MUST use
    244 * 64-bits to get the full range time in nanoseconds.
    245
    246 */
    247
    248/*
    249 * Here are the scales we will use.  One for seconds, nanoseconds and
    250 * microseconds.
    251 *
    252 * Within the limits of cpp we do a rough cut at the SEC_JIFFIE_SC and
    253 * check if the sign bit is set.  If not, we bump the shift count by 1.
    254 * (Gets an extra bit of precision where we can use it.)
    255 * We know it is set for HZ = 1024 and HZ = 100 not for 1000.
    256 * Haven't tested others.
    257
    258 * Limits of cpp (for #if expressions) only long (no long long), but
    259 * then we only need the most signicant bit.
    260 */
    261
    262#define SEC_JIFFIE_SC (31 - SHIFT_HZ)
    263#if !((((NSEC_PER_SEC << 2) / TICK_NSEC) << (SEC_JIFFIE_SC - 2)) & 0x80000000)
    264#undef SEC_JIFFIE_SC
    265#define SEC_JIFFIE_SC (32 - SHIFT_HZ)
    266#endif
    267#define NSEC_JIFFIE_SC (SEC_JIFFIE_SC + 29)
    268#define SEC_CONVERSION ((unsigned long)((((u64)NSEC_PER_SEC << SEC_JIFFIE_SC) +\
    269                                TICK_NSEC -1) / (u64)TICK_NSEC))
    270
    271#define NSEC_CONVERSION ((unsigned long)((((u64)1 << NSEC_JIFFIE_SC) +\
    272                                        TICK_NSEC -1) / (u64)TICK_NSEC))
    273/*
    274 * The maximum jiffie value is (MAX_INT >> 1).  Here we translate that
    275 * into seconds.  The 64-bit case will overflow if we are not careful,
    276 * so use the messy SH_DIV macro to do it.  Still all constants.
    277 */
    278#if BITS_PER_LONG < 64
    279# define MAX_SEC_IN_JIFFIES \
    280	(long)((u64)((u64)MAX_JIFFY_OFFSET * TICK_NSEC) / NSEC_PER_SEC)
    281#else	/* take care of overflow on 64 bits machines */
    282# define MAX_SEC_IN_JIFFIES \
    283	(SH_DIV((MAX_JIFFY_OFFSET >> SEC_JIFFIE_SC) * TICK_NSEC, NSEC_PER_SEC, 1) - 1)
    284
    285#endif
    286
    287/*
    288 * Convert various time units to each other:
    289 */
    290extern unsigned int jiffies_to_msecs(const unsigned long j);
    291extern unsigned int jiffies_to_usecs(const unsigned long j);
    292
    293static inline u64 jiffies_to_nsecs(const unsigned long j)
    294{
    295	return (u64)jiffies_to_usecs(j) * NSEC_PER_USEC;
    296}
    297
    298extern u64 jiffies64_to_nsecs(u64 j);
    299extern u64 jiffies64_to_msecs(u64 j);
    300
    301extern unsigned long __msecs_to_jiffies(const unsigned int m);
    302#if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ)
    303/*
    304 * HZ is equal to or smaller than 1000, and 1000 is a nice round
    305 * multiple of HZ, divide with the factor between them, but round
    306 * upwards:
    307 */
    308static inline unsigned long _msecs_to_jiffies(const unsigned int m)
    309{
    310	return (m + (MSEC_PER_SEC / HZ) - 1) / (MSEC_PER_SEC / HZ);
    311}
    312#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC)
    313/*
    314 * HZ is larger than 1000, and HZ is a nice round multiple of 1000 -
    315 * simply multiply with the factor between them.
    316 *
    317 * But first make sure the multiplication result cannot overflow:
    318 */
    319static inline unsigned long _msecs_to_jiffies(const unsigned int m)
    320{
    321	if (m > jiffies_to_msecs(MAX_JIFFY_OFFSET))
    322		return MAX_JIFFY_OFFSET;
    323	return m * (HZ / MSEC_PER_SEC);
    324}
    325#else
    326/*
    327 * Generic case - multiply, round and divide. But first check that if
    328 * we are doing a net multiplication, that we wouldn't overflow:
    329 */
    330static inline unsigned long _msecs_to_jiffies(const unsigned int m)
    331{
    332	if (HZ > MSEC_PER_SEC && m > jiffies_to_msecs(MAX_JIFFY_OFFSET))
    333		return MAX_JIFFY_OFFSET;
    334
    335	return (MSEC_TO_HZ_MUL32 * m + MSEC_TO_HZ_ADJ32) >> MSEC_TO_HZ_SHR32;
    336}
    337#endif
    338/**
    339 * msecs_to_jiffies: - convert milliseconds to jiffies
    340 * @m:	time in milliseconds
    341 *
    342 * conversion is done as follows:
    343 *
    344 * - negative values mean 'infinite timeout' (MAX_JIFFY_OFFSET)
    345 *
    346 * - 'too large' values [that would result in larger than
    347 *   MAX_JIFFY_OFFSET values] mean 'infinite timeout' too.
    348 *
    349 * - all other values are converted to jiffies by either multiplying
    350 *   the input value by a factor or dividing it with a factor and
    351 *   handling any 32-bit overflows.
    352 *   for the details see __msecs_to_jiffies()
    353 *
    354 * msecs_to_jiffies() checks for the passed in value being a constant
    355 * via __builtin_constant_p() allowing gcc to eliminate most of the
    356 * code, __msecs_to_jiffies() is called if the value passed does not
    357 * allow constant folding and the actual conversion must be done at
    358 * runtime.
    359 * the HZ range specific helpers _msecs_to_jiffies() are called both
    360 * directly here and from __msecs_to_jiffies() in the case where
    361 * constant folding is not possible.
    362 */
    363static __always_inline unsigned long msecs_to_jiffies(const unsigned int m)
    364{
    365	if (__builtin_constant_p(m)) {
    366		if ((int)m < 0)
    367			return MAX_JIFFY_OFFSET;
    368		return _msecs_to_jiffies(m);
    369	} else {
    370		return __msecs_to_jiffies(m);
    371	}
    372}
    373
    374extern unsigned long __usecs_to_jiffies(const unsigned int u);
    375#if !(USEC_PER_SEC % HZ)
    376static inline unsigned long _usecs_to_jiffies(const unsigned int u)
    377{
    378	return (u + (USEC_PER_SEC / HZ) - 1) / (USEC_PER_SEC / HZ);
    379}
    380#else
    381static inline unsigned long _usecs_to_jiffies(const unsigned int u)
    382{
    383	return (USEC_TO_HZ_MUL32 * u + USEC_TO_HZ_ADJ32)
    384		>> USEC_TO_HZ_SHR32;
    385}
    386#endif
    387
    388/**
    389 * usecs_to_jiffies: - convert microseconds to jiffies
    390 * @u:	time in microseconds
    391 *
    392 * conversion is done as follows:
    393 *
    394 * - 'too large' values [that would result in larger than
    395 *   MAX_JIFFY_OFFSET values] mean 'infinite timeout' too.
    396 *
    397 * - all other values are converted to jiffies by either multiplying
    398 *   the input value by a factor or dividing it with a factor and
    399 *   handling any 32-bit overflows as for msecs_to_jiffies.
    400 *
    401 * usecs_to_jiffies() checks for the passed in value being a constant
    402 * via __builtin_constant_p() allowing gcc to eliminate most of the
    403 * code, __usecs_to_jiffies() is called if the value passed does not
    404 * allow constant folding and the actual conversion must be done at
    405 * runtime.
    406 * the HZ range specific helpers _usecs_to_jiffies() are called both
    407 * directly here and from __msecs_to_jiffies() in the case where
    408 * constant folding is not possible.
    409 */
    410static __always_inline unsigned long usecs_to_jiffies(const unsigned int u)
    411{
    412	if (__builtin_constant_p(u)) {
    413		if (u > jiffies_to_usecs(MAX_JIFFY_OFFSET))
    414			return MAX_JIFFY_OFFSET;
    415		return _usecs_to_jiffies(u);
    416	} else {
    417		return __usecs_to_jiffies(u);
    418	}
    419}
    420
    421extern unsigned long timespec64_to_jiffies(const struct timespec64 *value);
    422extern void jiffies_to_timespec64(const unsigned long jiffies,
    423				  struct timespec64 *value);
    424extern clock_t jiffies_to_clock_t(unsigned long x);
    425static inline clock_t jiffies_delta_to_clock_t(long delta)
    426{
    427	return jiffies_to_clock_t(max(0L, delta));
    428}
    429
    430static inline unsigned int jiffies_delta_to_msecs(long delta)
    431{
    432	return jiffies_to_msecs(max(0L, delta));
    433}
    434
    435extern unsigned long clock_t_to_jiffies(unsigned long x);
    436extern u64 jiffies_64_to_clock_t(u64 x);
    437extern u64 nsec_to_clock_t(u64 x);
    438extern u64 nsecs_to_jiffies64(u64 n);
    439extern unsigned long nsecs_to_jiffies(u64 n);
    440
    441#define TIMESTAMP_SIZE	30
    442
    443#endif