| .. | .. |
|---|
| 23 | 23 | #define __branch_check__(x, expect, is_constant) ({ \ |
|---|
| 24 | 24 | long ______r; \ |
|---|
| 25 | 25 | static struct ftrace_likely_data \ |
|---|
| 26 | | - __attribute__((__aligned__(4))) \ |
|---|
| 27 | | - __attribute__((section("_ftrace_annotated_branch"))) \ |
|---|
| 26 | + __aligned(4) \ |
|---|
| 27 | + __section("_ftrace_annotated_branch") \ |
|---|
| 28 | 28 | ______f = { \ |
|---|
| 29 | 29 | .data.func = __func__, \ |
|---|
| 30 | 30 | .data.file = __FILE__, \ |
|---|
| .. | .. |
|---|
| 53 | 53 | * "Define 'is'", Bill Clinton |
|---|
| 54 | 54 | * "Define 'if'", Steven Rostedt |
|---|
| 55 | 55 | */ |
|---|
| 56 | | -#define if(cond, ...) __trace_if( (cond , ## __VA_ARGS__) ) |
|---|
| 57 | | -#define __trace_if(cond) \ |
|---|
| 58 | | - if (__builtin_constant_p(!!(cond)) ? !!(cond) : \ |
|---|
| 59 | | - ({ \ |
|---|
| 60 | | - int ______r; \ |
|---|
| 61 | | - static struct ftrace_branch_data \ |
|---|
| 62 | | - __attribute__((__aligned__(4))) \ |
|---|
| 63 | | - __attribute__((section("_ftrace_branch"))) \ |
|---|
| 64 | | - ______f = { \ |
|---|
| 65 | | - .func = __func__, \ |
|---|
| 66 | | - .file = __FILE__, \ |
|---|
| 67 | | - .line = __LINE__, \ |
|---|
| 68 | | - }; \ |
|---|
| 69 | | - ______r = !!(cond); \ |
|---|
| 70 | | - ______f.miss_hit[______r]++; \ |
|---|
| 71 | | - ______r; \ |
|---|
| 72 | | - })) |
|---|
| 56 | +#define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) |
|---|
| 57 | + |
|---|
| 58 | +#define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond)) |
|---|
| 59 | + |
|---|
| 60 | +#define __trace_if_value(cond) ({ \ |
|---|
| 61 | + static struct ftrace_branch_data \ |
|---|
| 62 | + __aligned(4) \ |
|---|
| 63 | + __section("_ftrace_branch") \ |
|---|
| 64 | + __if_trace = { \ |
|---|
| 65 | + .func = __func__, \ |
|---|
| 66 | + .file = __FILE__, \ |
|---|
| 67 | + .line = __LINE__, \ |
|---|
| 68 | + }; \ |
|---|
| 69 | + (cond) ? \ |
|---|
| 70 | + (__if_trace.miss_hit[1]++,1) : \ |
|---|
| 71 | + (__if_trace.miss_hit[0]++,0); \ |
|---|
| 72 | +}) |
|---|
| 73 | + |
|---|
| 73 | 74 | #endif /* CONFIG_PROFILE_ALL_BRANCHES */ |
|---|
| 74 | 75 | |
|---|
| 75 | 76 | #else |
|---|
| .. | .. |
|---|
| 130 | 131 | ".long 999b - .\n\t" \ |
|---|
| 131 | 132 | ".popsection\n\t" |
|---|
| 132 | 133 | |
|---|
| 133 | | -#ifdef CONFIG_DEBUG_ENTRY |
|---|
| 134 | | -/* Begin/end of an instrumentation safe region */ |
|---|
| 135 | | -#define instrumentation_begin() ({ \ |
|---|
| 136 | | - asm volatile("%c0:\n\t" \ |
|---|
| 137 | | - ".pushsection .discard.instr_begin\n\t" \ |
|---|
| 138 | | - ".long %c0b - .\n\t" \ |
|---|
| 139 | | - ".popsection\n\t" : : "i" (__COUNTER__)); \ |
|---|
| 140 | | -}) |
|---|
| 141 | | - |
|---|
| 142 | | -/* |
|---|
| 143 | | - * Because instrumentation_{begin,end}() can nest, objtool validation considers |
|---|
| 144 | | - * _begin() a +1 and _end() a -1 and computes a sum over the instructions. |
|---|
| 145 | | - * When the value is greater than 0, we consider instrumentation allowed. |
|---|
| 146 | | - * |
|---|
| 147 | | - * There is a problem with code like: |
|---|
| 148 | | - * |
|---|
| 149 | | - * noinstr void foo() |
|---|
| 150 | | - * { |
|---|
| 151 | | - * instrumentation_begin(); |
|---|
| 152 | | - * ... |
|---|
| 153 | | - * if (cond) { |
|---|
| 154 | | - * instrumentation_begin(); |
|---|
| 155 | | - * ... |
|---|
| 156 | | - * instrumentation_end(); |
|---|
| 157 | | - * } |
|---|
| 158 | | - * bar(); |
|---|
| 159 | | - * instrumentation_end(); |
|---|
| 160 | | - * } |
|---|
| 161 | | - * |
|---|
| 162 | | - * If instrumentation_end() would be an empty label, like all the other |
|---|
| 163 | | - * annotations, the inner _end(), which is at the end of a conditional block, |
|---|
| 164 | | - * would land on the instruction after the block. |
|---|
| 165 | | - * |
|---|
| 166 | | - * If we then consider the sum of the !cond path, we'll see that the call to |
|---|
| 167 | | - * bar() is with a 0-value, even though, we meant it to happen with a positive |
|---|
| 168 | | - * value. |
|---|
| 169 | | - * |
|---|
| 170 | | - * To avoid this, have _end() be a NOP instruction, this ensures it will be |
|---|
| 171 | | - * part of the condition block and does not escape. |
|---|
| 172 | | - */ |
|---|
| 173 | | -#define instrumentation_end() ({ \ |
|---|
| 174 | | - asm volatile("%c0: nop\n\t" \ |
|---|
| 175 | | - ".pushsection .discard.instr_end\n\t" \ |
|---|
| 176 | | - ".long %c0b - .\n\t" \ |
|---|
| 177 | | - ".popsection\n\t" : : "i" (__COUNTER__)); \ |
|---|
| 178 | | -}) |
|---|
| 179 | | -#endif /* CONFIG_DEBUG_ENTRY */ |
|---|
| 134 | +/* Annotate a C jump table to allow objtool to follow the code flow */ |
|---|
| 135 | +#define __annotate_jump_table __section(".rodata..c_jump_table") |
|---|
| 180 | 136 | |
|---|
| 181 | 137 | #else |
|---|
| 182 | 138 | #define annotate_reachable() |
|---|
| 183 | 139 | #define annotate_unreachable() |
|---|
| 184 | | -#endif |
|---|
| 185 | | - |
|---|
| 186 | | -#ifndef instrumentation_begin |
|---|
| 187 | | -#define instrumentation_begin() do { } while(0) |
|---|
| 188 | | -#define instrumentation_end() do { } while(0) |
|---|
| 140 | +#define __annotate_jump_table |
|---|
| 189 | 141 | #endif |
|---|
| 190 | 142 | |
|---|
| 191 | 143 | #ifndef ASM_UNREACHABLE |
|---|
| .. | .. |
|---|
| 217 | 169 | extern typeof(sym) sym; \ |
|---|
| 218 | 170 | static const unsigned long __kentry_##sym \ |
|---|
| 219 | 171 | __used \ |
|---|
| 220 | | - __attribute__((section("___kentry" "+" #sym ), used)) \ |
|---|
| 172 | + __attribute__((__section__("___kentry+" #sym))) \ |
|---|
| 221 | 173 | = (unsigned long)&sym; |
|---|
| 222 | 174 | #endif |
|---|
| 223 | 175 | |
|---|
| .. | .. |
|---|
| 241 | 193 | # define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __LINE__) |
|---|
| 242 | 194 | #endif |
|---|
| 243 | 195 | |
|---|
| 244 | | -#include <uapi/linux/types.h> |
|---|
| 245 | | - |
|---|
| 246 | | -#define __READ_ONCE_SIZE \ |
|---|
| 247 | | -({ \ |
|---|
| 248 | | - switch (size) { \ |
|---|
| 249 | | - case 1: *(__u8 *)res = *(volatile __u8 *)p; break; \ |
|---|
| 250 | | - case 2: *(__u16 *)res = *(volatile __u16 *)p; break; \ |
|---|
| 251 | | - case 4: *(__u32 *)res = *(volatile __u32 *)p; break; \ |
|---|
| 252 | | - case 8: *(__u64 *)res = *(volatile __u64 *)p; break; \ |
|---|
| 253 | | - default: \ |
|---|
| 254 | | - barrier(); \ |
|---|
| 255 | | - __builtin_memcpy((void *)res, (const void *)p, size); \ |
|---|
| 256 | | - barrier(); \ |
|---|
| 257 | | - } \ |
|---|
| 258 | | -}) |
|---|
| 259 | | - |
|---|
| 260 | | -static __always_inline |
|---|
| 261 | | -void __read_once_size(const volatile void *p, void *res, int size) |
|---|
| 262 | | -{ |
|---|
| 263 | | - __READ_ONCE_SIZE; |
|---|
| 264 | | -} |
|---|
| 265 | | - |
|---|
| 266 | | -#ifdef CONFIG_KASAN |
|---|
| 267 | | -/* |
|---|
| 268 | | - * We can't declare function 'inline' because __no_sanitize_address confilcts |
|---|
| 269 | | - * with inlining. Attempt to inline it may cause a build failure. |
|---|
| 270 | | - * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67368 |
|---|
| 271 | | - * '__maybe_unused' allows us to avoid defined-but-not-used warnings. |
|---|
| 272 | | - */ |
|---|
| 273 | | -# define __no_kasan_or_inline __no_sanitize_address notrace __maybe_unused |
|---|
| 274 | | -#else |
|---|
| 275 | | -# define __no_kasan_or_inline __always_inline |
|---|
| 276 | | -#endif |
|---|
| 277 | | - |
|---|
| 278 | | -static __no_kasan_or_inline |
|---|
| 279 | | -void __read_once_size_nocheck(const volatile void *p, void *res, int size) |
|---|
| 280 | | -{ |
|---|
| 281 | | - __READ_ONCE_SIZE; |
|---|
| 282 | | -} |
|---|
| 283 | | - |
|---|
| 284 | | -static __always_inline void __write_once_size(volatile void *p, void *res, int size) |
|---|
| 285 | | -{ |
|---|
| 286 | | - switch (size) { |
|---|
| 287 | | - case 1: *(volatile __u8 *)p = *(__u8 *)res; break; |
|---|
| 288 | | - case 2: *(volatile __u16 *)p = *(__u16 *)res; break; |
|---|
| 289 | | - case 4: *(volatile __u32 *)p = *(__u32 *)res; break; |
|---|
| 290 | | - case 8: *(volatile __u64 *)p = *(__u64 *)res; break; |
|---|
| 291 | | - default: |
|---|
| 292 | | - barrier(); |
|---|
| 293 | | - __builtin_memcpy((void *)p, (const void *)res, size); |
|---|
| 294 | | - barrier(); |
|---|
| 295 | | - } |
|---|
| 296 | | -} |
|---|
| 297 | | - |
|---|
| 298 | | -/* |
|---|
| 299 | | - * Prevent the compiler from merging or refetching reads or writes. The |
|---|
| 300 | | - * compiler is also forbidden from reordering successive instances of |
|---|
| 301 | | - * READ_ONCE and WRITE_ONCE, but only when the compiler is aware of some |
|---|
| 302 | | - * particular ordering. One way to make the compiler aware of ordering is to |
|---|
| 303 | | - * put the two invocations of READ_ONCE or WRITE_ONCE in different C |
|---|
| 304 | | - * statements. |
|---|
| 196 | +/** |
|---|
| 197 | + * data_race - mark an expression as containing intentional data races |
|---|
| 305 | 198 | * |
|---|
| 306 | | - * These two macros will also work on aggregate data types like structs or |
|---|
| 307 | | - * unions. If the size of the accessed data type exceeds the word size of |
|---|
| 308 | | - * the machine (e.g., 32 bits or 64 bits) READ_ONCE() and WRITE_ONCE() will |
|---|
| 309 | | - * fall back to memcpy(). There's at least two memcpy()s: one for the |
|---|
| 310 | | - * __builtin_memcpy() and then one for the macro doing the copy of variable |
|---|
| 311 | | - * - '__u' allocated on the stack. |
|---|
| 199 | + * This data_race() macro is useful for situations in which data races |
|---|
| 200 | + * should be forgiven. One example is diagnostic code that accesses |
|---|
| 201 | + * shared variables but is not a part of the core synchronization design. |
|---|
| 312 | 202 | * |
|---|
| 313 | | - * Their two major use cases are: (1) Mediating communication between |
|---|
| 314 | | - * process-level code and irq/NMI handlers, all running on the same CPU, |
|---|
| 315 | | - * and (2) Ensuring that the compiler does not fold, spindle, or otherwise |
|---|
| 316 | | - * mutilate accesses that either do not require ordering or that interact |
|---|
| 317 | | - * with an explicit memory barrier or atomic instruction that provides the |
|---|
| 318 | | - * required ordering. |
|---|
| 203 | + * This macro *does not* affect normal code generation, but is a hint |
|---|
| 204 | + * to tooling that data races here are to be ignored. |
|---|
| 319 | 205 | */ |
|---|
| 320 | | -#include <asm/barrier.h> |
|---|
| 321 | | -#include <linux/kasan-checks.h> |
|---|
| 322 | | - |
|---|
| 323 | | -#define __READ_ONCE(x, check) \ |
|---|
| 206 | +#define data_race(expr) \ |
|---|
| 324 | 207 | ({ \ |
|---|
| 325 | | - union { typeof(x) __val; char __c[1]; } __u; \ |
|---|
| 326 | | - if (check) \ |
|---|
| 327 | | - __read_once_size(&(x), __u.__c, sizeof(x)); \ |
|---|
| 328 | | - else \ |
|---|
| 329 | | - __read_once_size_nocheck(&(x), __u.__c, sizeof(x)); \ |
|---|
| 330 | | - smp_read_barrier_depends(); /* Enforce dependency ordering from x */ \ |
|---|
| 331 | | - __u.__val; \ |
|---|
| 332 | | -}) |
|---|
| 333 | | -#define READ_ONCE(x) __READ_ONCE(x, 1) |
|---|
| 334 | | - |
|---|
| 335 | | -/* |
|---|
| 336 | | - * Use READ_ONCE_NOCHECK() instead of READ_ONCE() if you need |
|---|
| 337 | | - * to hide memory access from KASAN. |
|---|
| 338 | | - */ |
|---|
| 339 | | -#define READ_ONCE_NOCHECK(x) __READ_ONCE(x, 0) |
|---|
| 340 | | - |
|---|
| 341 | | -static __no_kasan_or_inline |
|---|
| 342 | | -unsigned long read_word_at_a_time(const void *addr) |
|---|
| 343 | | -{ |
|---|
| 344 | | - kasan_check_read(addr, 1); |
|---|
| 345 | | - return *(unsigned long *)addr; |
|---|
| 346 | | -} |
|---|
| 347 | | - |
|---|
| 348 | | -#define WRITE_ONCE(x, val) \ |
|---|
| 349 | | -({ \ |
|---|
| 350 | | - union { typeof(x) __val; char __c[1]; } __u = \ |
|---|
| 351 | | - { .__val = (__force typeof(x)) (val) }; \ |
|---|
| 352 | | - __write_once_size(&(x), __u.__c, sizeof(x)); \ |
|---|
| 353 | | - __u.__val; \ |
|---|
| 208 | + __unqual_scalar_typeof(({ expr; })) __v = ({ \ |
|---|
| 209 | + __kcsan_disable_current(); \ |
|---|
| 210 | + expr; \ |
|---|
| 211 | + }); \ |
|---|
| 212 | + __kcsan_enable_current(); \ |
|---|
| 213 | + __v; \ |
|---|
| 354 | 214 | }) |
|---|
| 355 | 215 | |
|---|
| 356 | 216 | #endif /* __KERNEL__ */ |
|---|
| .. | .. |
|---|
| 362 | 222 | * visible to the compiler. |
|---|
| 363 | 223 | */ |
|---|
| 364 | 224 | #define __ADDRESSABLE(sym) \ |
|---|
| 365 | | - static void * __attribute__((section(".discard.addressable"), used)) \ |
|---|
| 366 | | - __PASTE(__addressable_##sym, __LINE__) = (void *)&sym; |
|---|
| 225 | + static void * __section(".discard.addressable") __used \ |
|---|
| 226 | + __UNIQUE_ID(__PASTE(__addressable_,sym)) = (void *)&sym; |
|---|
| 367 | 227 | |
|---|
| 368 | 228 | /** |
|---|
| 369 | 229 | * offset_to_ptr - convert a relative memory offset to an absolute pointer |
|---|
| .. | .. |
|---|
| 376 | 236 | |
|---|
| 377 | 237 | #endif /* __ASSEMBLY__ */ |
|---|
| 378 | 238 | |
|---|
| 379 | | -#ifndef __optimize |
|---|
| 380 | | -# define __optimize(level) |
|---|
| 381 | | -#endif |
|---|
| 382 | | - |
|---|
| 383 | | -/* Compile time object size, -1 for unknown */ |
|---|
| 384 | | -#ifndef __compiletime_object_size |
|---|
| 385 | | -# define __compiletime_object_size(obj) -1 |
|---|
| 386 | | -#endif |
|---|
| 387 | | -#ifndef __compiletime_warning |
|---|
| 388 | | -# define __compiletime_warning(message) |
|---|
| 389 | | -#endif |
|---|
| 390 | | -#ifndef __compiletime_error |
|---|
| 391 | | -# define __compiletime_error(message) |
|---|
| 392 | | -#endif |
|---|
| 393 | | - |
|---|
| 394 | | -#ifdef __OPTIMIZE__ |
|---|
| 395 | | -# define __compiletime_assert(condition, msg, prefix, suffix) \ |
|---|
| 396 | | - do { \ |
|---|
| 397 | | - extern void prefix ## suffix(void) __compiletime_error(msg); \ |
|---|
| 398 | | - if (!(condition)) \ |
|---|
| 399 | | - prefix ## suffix(); \ |
|---|
| 400 | | - } while (0) |
|---|
| 401 | | -#else |
|---|
| 402 | | -# define __compiletime_assert(condition, msg, prefix, suffix) do { } while (0) |
|---|
| 403 | | -#endif |
|---|
| 404 | | - |
|---|
| 405 | | -#define _compiletime_assert(condition, msg, prefix, suffix) \ |
|---|
| 406 | | - __compiletime_assert(condition, msg, prefix, suffix) |
|---|
| 407 | | - |
|---|
| 408 | | -/** |
|---|
| 409 | | - * compiletime_assert - break build and emit msg if condition is false |
|---|
| 410 | | - * @condition: a compile-time constant condition to check |
|---|
| 411 | | - * @msg: a message to emit if condition is false |
|---|
| 412 | | - * |
|---|
| 413 | | - * In tradition of POSIX assert, this macro will break the build if the |
|---|
| 414 | | - * supplied condition is *false*, emitting the supplied error message if the |
|---|
| 415 | | - * compiler has support to do so. |
|---|
| 416 | | - */ |
|---|
| 417 | | -#define compiletime_assert(condition, msg) \ |
|---|
| 418 | | - _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) |
|---|
| 419 | | - |
|---|
| 420 | | -#define compiletime_assert_atomic_type(t) \ |
|---|
| 421 | | - compiletime_assert(__native_word(t), \ |
|---|
| 422 | | - "Need native word sized stores/loads for atomicity.") |
|---|
| 239 | +/* &a[0] degrades to a pointer: a different type from an array */ |
|---|
| 240 | +#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0])) |
|---|
| 423 | 241 | |
|---|
| 424 | 242 | /* |
|---|
| 425 | 243 | * This is needed in functions which generate the stack canary, see |
|---|
| .. | .. |
|---|
| 427 | 245 | */ |
|---|
| 428 | 246 | #define prevent_tail_call_optimization() mb() |
|---|
| 429 | 247 | |
|---|
| 248 | +#include <asm/rwonce.h> |
|---|
| 249 | + |
|---|
| 430 | 250 | #endif /* __LINUX_COMPILER_H */ |
|---|