Commit | Line | Data |
---|---|---|
9f36eaed MJ |
1 | /* SPDX-License-Identifier: (GPL-2.0 or LGPL-2.1) |
2 | * | |
5fa38800 MD |
3 | * lttng-kernel-version.h |
4 | * | |
919f2868 | 5 | * Contains helpers to check kernel version conditions. |
5fa38800 MD |
6 | * |
7 | * Copyright (C) 2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com> | |
5fa38800 MD |
8 | */ |
9 | ||
9f36eaed MJ |
10 | #ifndef _LTTNG_KERNEL_VERSION_H |
11 | #define _LTTNG_KERNEL_VERSION_H | |
12 | ||
5fa38800 | 13 | #include <linux/version.h> |
9f61c55f | 14 | #include <generated/utsrelease.h> |
5fa38800 | 15 | |
919f2868 MJ |
16 | /* |
17 | * The following defines are extracted from the toplevel Linux Makefile and | |
18 | * passed on the command line -with '-D'. | |
19 | */ | |
20 | ||
21 | #ifndef LTTNG_LINUX_MAJOR | |
22 | #define LTTNG_LINUX_MAJOR 0 | |
23 | #endif | |
24 | ||
25 | #ifndef LTTNG_LINUX_MINOR | |
26 | #define LTTNG_LINUX_MINOR 0 | |
27 | #endif | |
28 | ||
29 | #ifndef LTTNG_LINUX_PATCH | |
30 | #define LTTNG_LINUX_PATCH 0 | |
31 | #endif | |
32 | ||
33 | /* | |
34 | * Some stable releases have overflowed the 8bits allocated to the sublevel in | |
35 | * the version code. To determine if the current kernel is affected, use the | |
36 | * sublevel version from the Makefile. This is currently true for the 4.4.256 | |
37 | * and 4.9.256 stable releases. | |
38 | * | |
39 | * When the sublevel has overflowed, use the values from the Makefile instead | |
40 | * of LINUX_VERSION_CODE from the kernel headers and allocate 16bits. | |
41 | * Otherwise, keep using the version code from the headers to minimise the | |
42 | * behavior change and avoid regressions. | |
6f182b54 MJ |
43 | * |
44 | * Cast the result to uint64_t to prevent overflowing when we append distro | |
45 | * specific version information. | |
919f2868 MJ |
46 | */ |
47 | #if (LTTNG_LINUX_PATCH >= 256) | |
48 | ||
49 | #define LTTNG_KERNEL_VERSION(a, b, c) \ | |
6f182b54 | 50 | ((((a) << 24) + ((b) << 16) + (c)) * 1ULL) |
919f2868 MJ |
51 | |
52 | #define LTTNG_LINUX_VERSION_CODE \ | |
53 | LTTNG_KERNEL_VERSION(LTTNG_LINUX_MAJOR, LTTNG_LINUX_MINOR, LTTNG_LINUX_PATCH) | |
54 | ||
55 | #else | |
56 | ||
6f182b54 MJ |
57 | #define LTTNG_KERNEL_VERSION(a, b, c) (KERNEL_VERSION(a, b, c) * 1ULL) |
58 | #define LTTNG_LINUX_VERSION_CODE (LINUX_VERSION_CODE * 1ULL) | |
2d042821 | 59 | |
919f2868 MJ |
60 | #endif |
61 | ||
5fa38800 MD |
62 | /* |
63 | * This macro checks if the kernel version is between the two specified | |
144bbfd5 | 64 | * versions (lower limit inclusive, upper limit exclusive). |
5fa38800 MD |
65 | */ |
66 | #define LTTNG_KERNEL_RANGE(a_low, b_low, c_low, a_high, b_high, c_high) \ | |
2d042821 MJ |
67 | (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(a_low, b_low, c_low) && \ |
68 | LTTNG_LINUX_VERSION_CODE < LTTNG_KERNEL_VERSION(a_high, b_high, c_high)) | |
5fa38800 | 69 | |
c94ac1ac MJ |
70 | /* Ubuntu */ |
71 | ||
3e5941df | 72 | #define LTTNG_UBUNTU_KERNEL_VERSION(a, b, c, d) \ |
140ade75 | 73 | (((LTTNG_KERNEL_VERSION(a, b, c)) << 16) + (d)) |
3e5941df | 74 | |
05732a66 | 75 | #ifdef UTS_UBUNTU_RELEASE_ABI |
3e5941df | 76 | #define LTTNG_UBUNTU_VERSION_CODE \ |
140ade75 | 77 | ((LTTNG_LINUX_VERSION_CODE << 16) + UTS_UBUNTU_RELEASE_ABI) |
05732a66 MD |
78 | #else |
79 | #define LTTNG_UBUNTU_VERSION_CODE 0 | |
80 | #endif | |
3e5941df JD |
81 | |
82 | #define LTTNG_UBUNTU_KERNEL_RANGE(a_low, b_low, c_low, d_low, \ | |
83 | a_high, b_high, c_high, d_high) \ | |
05732a66 | 84 | (LTTNG_UBUNTU_VERSION_CODE >= \ |
3e5941df JD |
85 | LTTNG_UBUNTU_KERNEL_VERSION(a_low, b_low, c_low, d_low) && \ |
86 | LTTNG_UBUNTU_VERSION_CODE < \ | |
87 | LTTNG_UBUNTU_KERNEL_VERSION(a_high, b_high, c_high, d_high)) | |
88 | ||
c94ac1ac MJ |
89 | /* Debian */ |
90 | ||
72e6c528 | 91 | #define LTTNG_DEBIAN_KERNEL_VERSION(a, b, c, d, e, f) \ |
2d042821 | 92 | (((LTTNG_KERNEL_VERSION(a, b, c)) * 1000000ULL) + ((d) * 10000) + ((e) * 100) + (f)) |
72e6c528 | 93 | |
05732a66 | 94 | #ifdef DEBIAN_API_VERSION |
72e6c528 | 95 | #define LTTNG_DEBIAN_VERSION_CODE \ |
2d042821 | 96 | ((LTTNG_LINUX_VERSION_CODE * 1000000ULL) + DEBIAN_API_VERSION) |
05732a66 MD |
97 | #else |
98 | #define LTTNG_DEBIAN_VERSION_CODE 0 | |
99 | #endif | |
72e6c528 MD |
100 | |
101 | #define LTTNG_DEBIAN_KERNEL_RANGE(a_low, b_low, c_low, d_low, e_low, f_low, \ | |
102 | a_high, b_high, c_high, d_high, e_high, f_high) \ | |
05732a66 | 103 | (LTTNG_DEBIAN_VERSION_CODE >= \ |
72e6c528 MD |
104 | LTTNG_DEBIAN_KERNEL_VERSION(a_low, b_low, c_low, d_low, e_low, f_low) && \ |
105 | LTTNG_DEBIAN_VERSION_CODE < \ | |
106 | LTTNG_DEBIAN_KERNEL_VERSION(a_high, b_high, c_high, d_high, e_high, f_high)) | |
107 | ||
c94ac1ac | 108 | #define LTTNG_RHEL_KERNEL_VERSION(a, b, c, d, e, f) \ |
0fbfe06e | 109 | (((LTTNG_KERNEL_VERSION(a, b, c)) * 100000000ULL) + ((d) * 10000) + ((e) * 100) + (f)) |
c94ac1ac MJ |
110 | |
111 | /* RHEL */ | |
f30ae671 | 112 | |
c94ac1ac | 113 | #ifdef RHEL_API_VERSION |
f30ae671 | 114 | #define LTTNG_RHEL_VERSION_CODE \ |
0fbfe06e | 115 | ((LTTNG_LINUX_VERSION_CODE * 100000000ULL) + RHEL_API_VERSION) |
f30ae671 MD |
116 | #else |
117 | #define LTTNG_RHEL_VERSION_CODE 0 | |
118 | #endif | |
119 | ||
c94ac1ac MJ |
120 | #define LTTNG_RHEL_KERNEL_RANGE(a_low, b_low, c_low, d_low, e_low, f_low, \ |
121 | a_high, b_high, c_high, d_high, e_high, f_high) \ | |
f30ae671 | 122 | (LTTNG_RHEL_VERSION_CODE >= \ |
c94ac1ac | 123 | LTTNG_RHEL_KERNEL_VERSION(a_low, b_low, c_low, d_low, e_low, f_low) && \ |
f30ae671 | 124 | LTTNG_RHEL_VERSION_CODE < \ |
c94ac1ac MJ |
125 | LTTNG_RHEL_KERNEL_VERSION(a_high, b_high, c_high, d_high, e_high, f_high)) |
126 | ||
ce66b486 MJ |
127 | /* SUSE Linux enterprise */ |
128 | ||
c9ca49ae KS |
129 | /* |
130 | * SLE major version codes may be large, eg. 150400, and require more than | |
131 | * 32 bits to store. Multiplying `a` by `1ULL` avoids compiler warnings, eg: | |
132 | * | |
133 | * `warning: result of ‘150400 << 16’ requires 35 bits to represent, but ‘int’ only has 32 bits` | |
134 | * | |
135 | */ | |
136 | #define LTTNG_SLE_VERSION(a, b, c) \ | |
137 | ((((a * 1ULL) << 16) + (b << 8) + c) * 1ULL) | |
ce66b486 | 138 | |
c9ca49ae | 139 | #if defined(SLE_API_VERSION_MAJOR) && defined(SLE_API_VERSION_MINOR) && defined(SLE_API_VERSION_PATCH) |
ce66b486 | 140 | #define LTTNG_SLE_VERSION_CODE \ |
c9ca49ae | 141 | (LTTNG_SLE_VERSION(SLE_API_VERSION_MAJOR, SLE_API_VERSION_MINOR, SLE_API_VERSION_PATCH)) |
ce66b486 | 142 | #else |
c9ca49ae | 143 | #define LTTNG_SLE_VERSION_CODE 0 |
ce66b486 MJ |
144 | #endif |
145 | ||
146 | #define LTTNG_SLE_KERNEL_RANGE(a_low, b_low, c_low, d_low, e_low, f_low, \ | |
147 | a_high, b_high, c_high, d_high, e_high, f_high) \ | |
c9ca49ae KS |
148 | ( \ |
149 | LTTNG_SLE_VERSION_CODE != 0 && \ | |
150 | ( \ | |
151 | /* Linux kernel version code exclusive inside range */ \ | |
152 | (LTTNG_LINUX_VERSION_CODE > LTTNG_KERNEL_VERSION(a_low, b_low, c_low) && \ | |
153 | LTTNG_LINUX_VERSION_CODE < LTTNG_KERNEL_VERSION(a_high, b_high, c_high)) || \ | |
154 | \ | |
155 | /* Linux kernel version code is at lower and upper limit */ \ | |
156 | (LTTNG_LINUX_VERSION_CODE == LTTNG_KERNEL_VERSION(a_low, b_low, c_low) && \ | |
157 | LTTNG_LINUX_VERSION_CODE == LTTNG_KERNEL_VERSION(a_high, b_high, c_high) && \ | |
158 | LTTNG_SLE_VERSION_CODE >= LTTNG_SLE_VERSION(d_low, e_low, f_low) && \ | |
159 | LTTNG_SLE_VERSION_CODE < LTTNG_SLE_VERSION(d_high, e_high, f_high)) || \ | |
160 | \ | |
161 | /* Linux kernel version code is at lower limit */ \ | |
162 | (LTTNG_LINUX_VERSION_CODE == LTTNG_KERNEL_VERSION(a_low, b_low, c_low) && \ | |
163 | LTTNG_KERNEL_VERSION(a_low, b_low, c_low) != LTTNG_KERNEL_VERSION(a_high, b_high, c_high) && \ | |
164 | LTTNG_SLE_VERSION_CODE >= LTTNG_SLE_VERSION(d_low, e_low, f_low)) || \ | |
165 | \ | |
166 | /* Linux kernel version code is at upper limit */ \ | |
167 | (LTTNG_LINUX_VERSION_CODE == LTTNG_KERNEL_VERSION(a_high, b_high, c_high) && \ | |
168 | LTTNG_KERNEL_VERSION(a_low, b_low, c_low) != LTTNG_KERNEL_VERSION(a_high, b_high, c_high) && \ | |
169 | LTTNG_SLE_VERSION_CODE < LTTNG_SLE_VERSION(d_high, e_high, f_high)) \ | |
170 | )) | |
ce66b486 | 171 | |
e4838da1 LG |
172 | /* Fedora */ |
173 | ||
174 | #define LTTNG_FEDORA_KERNEL_VERSION(a, b, c, d) \ | |
2d042821 | 175 | (((LTTNG_KERNEL_VERSION(a, b, c)) * 10000ULL) + (d)) |
e4838da1 LG |
176 | |
177 | #ifdef FEDORA_REVISION_VERSION | |
178 | #define LTTNG_FEDORA_VERSION_CODE \ | |
2d042821 | 179 | ((LTTNG_LINUX_VERSION_CODE * 10000ULL) + FEDORA_REVISION_VERSION) |
e4838da1 LG |
180 | #else |
181 | #define LTTNG_FEDORA_VERSION_CODE 0 | |
182 | #endif | |
183 | ||
184 | #define LTTNG_FEDORA_KERNEL_RANGE(a_low, b_low, c_low, d_low, \ | |
185 | a_high, b_high, c_high, d_high) \ | |
186 | (LTTNG_FEDORA_VERSION_CODE >= \ | |
187 | LTTNG_FEDORA_KERNEL_VERSION(a_low, b_low, c_low, d_low) && \ | |
188 | LTTNG_FEDORA_VERSION_CODE < \ | |
189 | LTTNG_FEDORA_KERNEL_VERSION(a_high, b_high, c_high, d_high)) | |
190 | ||
c94ac1ac | 191 | /* RT patch */ |
f30ae671 | 192 | |
b4c8e4d3 | 193 | #define LTTNG_RT_KERNEL_VERSION(a, b, c, d) \ |
2c57c04e | 194 | (((LTTNG_KERNEL_VERSION(a, b, c)) << 16) + (d)) |
b4c8e4d3 MJ |
195 | |
196 | #ifdef RT_PATCH_VERSION | |
197 | #define LTTNG_RT_VERSION_CODE \ | |
2c57c04e | 198 | ((LTTNG_LINUX_VERSION_CODE << 16) + RT_PATCH_VERSION) |
b4c8e4d3 MJ |
199 | #else |
200 | #define LTTNG_RT_VERSION_CODE 0 | |
201 | #endif | |
202 | ||
203 | #define LTTNG_RT_KERNEL_RANGE(a_low, b_low, c_low, d_low, \ | |
204 | a_high, b_high, c_high, d_high) \ | |
205 | (LTTNG_RT_VERSION_CODE >= \ | |
206 | LTTNG_RT_KERNEL_VERSION(a_low, b_low, c_low, d_low) && \ | |
207 | LTTNG_RT_VERSION_CODE < \ | |
208 | LTTNG_RT_KERNEL_VERSION(a_high, b_high, c_high, d_high)) | |
209 | ||
5fa38800 | 210 | #endif /* _LTTNG_KERNEL_VERSION_H */ |