Blame view

include/vdso/datapage.h 4.12 KB
361f8aee9   Vincenzo Frascino   vdso: Define stan...
1
2
3
  /* SPDX-License-Identifier: GPL-2.0 */
  #ifndef __VDSO_DATAPAGE_H
  #define __VDSO_DATAPAGE_H
361f8aee9   Vincenzo Frascino   vdso: Define stan...
4
  #ifndef __ASSEMBLY__
8c59ab839   Vincenzo Frascino   lib/vdso: Enable ...
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  #include <linux/compiler.h>
  #include <uapi/linux/time.h>
  #include <uapi/linux/types.h>
  #include <uapi/asm-generic/errno-base.h>
  
  #include <vdso/bits.h>
  #include <vdso/clocksource.h>
  #include <vdso/ktime.h>
  #include <vdso/limits.h>
  #include <vdso/math64.h>
  #include <vdso/processor.h>
  #include <vdso/time.h>
  #include <vdso/time32.h>
  #include <vdso/time64.h>
361f8aee9   Vincenzo Frascino   vdso: Define stan...
19

d60d7de3e   Sven Schnelle   lib/vdso: Allow t...
20
21
22
23
24
  #ifdef CONFIG_ARCH_HAS_VDSO_DATA
  #include <asm/vdso/data.h>
  #else
  struct arch_vdso_data {};
  #endif
361f8aee9   Vincenzo Frascino   vdso: Define stan...
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
  #define VDSO_BASES	(CLOCK_TAI + 1)
  #define VDSO_HRES	(BIT(CLOCK_REALTIME)		| \
  			 BIT(CLOCK_MONOTONIC)		| \
  			 BIT(CLOCK_BOOTTIME)		| \
  			 BIT(CLOCK_TAI))
  #define VDSO_COARSE	(BIT(CLOCK_REALTIME_COARSE)	| \
  			 BIT(CLOCK_MONOTONIC_COARSE))
  #define VDSO_RAW	(BIT(CLOCK_MONOTONIC_RAW))
  
  #define CS_HRES_COARSE	0
  #define CS_RAW		1
  #define CS_BASES	(CS_RAW + 1)
  
  /**
   * struct vdso_timestamp - basetime per clock_id
   * @sec:	seconds
   * @nsec:	nanoseconds
   *
   * There is one vdso_timestamp object in vvar for each vDSO-accelerated
   * clock_id. For high-resolution clocks, this encodes the time
   * corresponding to vdso_data.cycle_last. For coarse clocks this encodes
   * the actual time.
   *
   * To be noticed that for highres clocks nsec is left-shifted by
   * vdso_data.cs[x].shift.
   */
  struct vdso_timestamp {
  	u64	sec;
  	u64	nsec;
  };
  
  /**
   * struct vdso_data - vdso datapage representation
   * @seq:		timebase sequence counter
   * @clock_mode:		clock mode
   * @cycle_last:		timebase at clocksource init
   * @mask:		clocksource mask
   * @mult:		clocksource multiplier
   * @shift:		clocksource shift
   * @basetime[clock_id]:	basetime per clock_id
660fd04f9   Thomas Gleixner   lib/vdso: Prepare...
65
   * @offset[clock_id]:	time namespace offset per clock_id
361f8aee9   Vincenzo Frascino   vdso: Define stan...
66
67
68
69
   * @tz_minuteswest:	minutes west of Greenwich
   * @tz_dsttime:		type of DST correction
   * @hrtimer_res:	hrtimer resolution
   * @__unused:		unused
d60d7de3e   Sven Schnelle   lib/vdso: Allow t...
70
71
   * @arch_data:		architecture specific data (optional, defaults
   *			to an empty struct)
361f8aee9   Vincenzo Frascino   vdso: Define stan...
72
73
74
   *
   * vdso_data will be accessed by 64 bit and compat code at the same time
   * so we should be careful before modifying this structure.
660fd04f9   Thomas Gleixner   lib/vdso: Prepare...
75
76
77
78
79
80
   *
   * @basetime is used to store the base time for the system wide time getter
   * VVAR page.
   *
   * @offset is used by the special time namespace VVAR pages which are
   * installed instead of the real VVAR page. These namespace pages must set
ac84bac40   Christian Brauner   vdso/datapage: Us...
81
82
   * @seq to 1 and @clock_mode to VDSO_CLOCKMODE_TIMENS to force the code into
   * the time namespace slow path. The namespace aware functions retrieve the
660fd04f9   Thomas Gleixner   lib/vdso: Prepare...
83
84
85
   * real system wide VVAR page, read host time and add the per clock offset.
   * For clocks which are not affected by time namespace adjustment the
   * offset must be zero.
361f8aee9   Vincenzo Frascino   vdso: Define stan...
86
87
88
89
90
91
92
93
94
   */
  struct vdso_data {
  	u32			seq;
  
  	s32			clock_mode;
  	u64			cycle_last;
  	u64			mask;
  	u32			mult;
  	u32			shift;
660fd04f9   Thomas Gleixner   lib/vdso: Prepare...
95
96
97
98
  	union {
  		struct vdso_timestamp	basetime[VDSO_BASES];
  		struct timens_offset	offset[VDSO_BASES];
  	};
361f8aee9   Vincenzo Frascino   vdso: Define stan...
99
100
101
102
103
  
  	s32			tz_minuteswest;
  	s32			tz_dsttime;
  	u32			hrtimer_res;
  	u32			__unused;
d60d7de3e   Sven Schnelle   lib/vdso: Allow t...
104
105
  
  	struct arch_vdso_data	arch_data;
361f8aee9   Vincenzo Frascino   vdso: Define stan...
106
107
108
109
110
111
112
113
114
115
116
117
  };
  
  /*
   * We use the hidden visibility to prevent the compiler from generating a GOT
   * relocation. Not only is going through a GOT useless (the entry couldn't and
   * must not be overridden by another library), it does not even work: the linker
   * cannot generate an absolute address to the data page.
   *
   * With the hidden visibility, the compiler simply generates a PC-relative
   * relocation, and this is what we need.
   */
  extern struct vdso_data _vdso_data[CS_BASES] __attribute__((visibility("hidden")));
3503d56cc   Andrei Vagin   arm64/vdso: Add t...
118
  extern struct vdso_data _timens_data[CS_BASES] __attribute__((visibility("hidden")));
361f8aee9   Vincenzo Frascino   vdso: Define stan...
119

8c59ab839   Vincenzo Frascino   lib/vdso: Enable ...
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
  /*
   * The generic vDSO implementation requires that gettimeofday.h
   * provides:
   * - __arch_get_vdso_data(): to get the vdso datapage.
   * - __arch_get_hw_counter(): to get the hw counter based on the
   *   clock_mode.
   * - gettimeofday_fallback(): fallback for gettimeofday.
   * - clock_gettime_fallback(): fallback for clock_gettime.
   * - clock_getres_fallback(): fallback for clock_getres.
   */
  #ifdef ENABLE_COMPAT_VDSO
  #include <asm/vdso/compat_gettimeofday.h>
  #else
  #include <asm/vdso/gettimeofday.h>
  #endif /* ENABLE_COMPAT_VDSO */
361f8aee9   Vincenzo Frascino   vdso: Define stan...
135
  #endif /* !__ASSEMBLY__ */
361f8aee9   Vincenzo Frascino   vdso: Define stan...
136
  #endif /* __VDSO_DATAPAGE_H */