9#ifndef _LINUX_KCSAN_CHECKS_H
10#define _LINUX_KCSAN_CHECKS_H
17#define KCSAN_ACCESS_WRITE (1 << 0)
18#define KCSAN_ACCESS_COMPOUND (1 << 1)
19#define KCSAN_ACCESS_ATOMIC (1 << 2)
21#define KCSAN_ACCESS_ASSERT (1 << 3)
22#define KCSAN_ACCESS_SCOPED (1 << 4)
37void __kcsan_check_access(
const volatile void *ptr,
size_t size,
int type);
44#define __KCSAN_BARRIER_TO_SIGNAL_FENCE_mb __ATOMIC_SEQ_CST
45#define __KCSAN_BARRIER_TO_SIGNAL_FENCE_wmb __ATOMIC_ACQ_REL
46#define __KCSAN_BARRIER_TO_SIGNAL_FENCE_rmb __ATOMIC_ACQUIRE
47#define __KCSAN_BARRIER_TO_SIGNAL_FENCE_release __ATOMIC_RELEASE
57void __kcsan_wmb(
void);
62void __kcsan_rmb(
void);
67void __kcsan_release(
void);
74void kcsan_disable_current(
void);
81void kcsan_enable_current(
void);
82void kcsan_enable_current_nowarn(
void);
90void kcsan_nestable_atomic_begin(
void);
95void kcsan_nestable_atomic_end(
void);
103void kcsan_flat_atomic_begin(
void);
108void kcsan_flat_atomic_end(
void);
118void kcsan_atomic_next(
int n);
128void kcsan_set_access_mask(
unsigned long mask);
142 const volatile void *ptr;
153#define __kcsan_cleanup_scoped \
154 __maybe_unused __attribute__((__cleanup__(kcsan_end_scoped_access)))
173kcsan_begin_scoped_access(
const volatile void *ptr,
size_t size,
int type,
189static inline void __kcsan_check_access(
const volatile void *ptr,
size_t size,
192static inline void __kcsan_mb(
void) { }
193static inline void __kcsan_wmb(
void) { }
194static inline void __kcsan_rmb(
void) { }
195static inline void __kcsan_release(
void) { }
196static inline void kcsan_disable_current(
void) { }
197static inline void kcsan_enable_current(
void) { }
198static inline void kcsan_enable_current_nowarn(
void) { }
199static inline void kcsan_nestable_atomic_begin(
void) { }
200static inline void kcsan_nestable_atomic_end(
void) { }
201static inline void kcsan_flat_atomic_begin(
void) { }
202static inline void kcsan_flat_atomic_end(
void) { }
203static inline void kcsan_atomic_next(
int n) { }
204static inline void kcsan_set_access_mask(
unsigned long mask) { }
207#define __kcsan_cleanup_scoped __maybe_unused
209kcsan_begin_scoped_access(
const volatile void *ptr,
size_t size,
int type,
215#ifdef __SANITIZE_THREAD__
220#define kcsan_check_access __kcsan_check_access
226#define __kcsan_disable_current kcsan_disable_current
227#define __kcsan_enable_current kcsan_enable_current_nowarn
229static inline void kcsan_check_access(
const volatile void *ptr,
size_t size,
231static inline void __kcsan_enable_current(
void) { }
232static inline void __kcsan_disable_current(
void) { }
235#if defined(CONFIG_KCSAN_WEAK_MEMORY) && defined(__SANITIZE_THREAD__)
248#define __KCSAN_BARRIER_TO_SIGNAL_FENCE(name) \
251 __atomic_signal_fence(__KCSAN_BARRIER_TO_SIGNAL_FENCE_##name); \
254#define kcsan_mb() __KCSAN_BARRIER_TO_SIGNAL_FENCE(mb)
255#define kcsan_wmb() __KCSAN_BARRIER_TO_SIGNAL_FENCE(wmb)
256#define kcsan_rmb() __KCSAN_BARRIER_TO_SIGNAL_FENCE(rmb)
257#define kcsan_release() __KCSAN_BARRIER_TO_SIGNAL_FENCE(release)
258#elif defined(CONFIG_KCSAN_WEAK_MEMORY) && defined(__KCSAN_INSTRUMENT_BARRIERS__)
259#define kcsan_mb __kcsan_mb
260#define kcsan_wmb __kcsan_wmb
261#define kcsan_rmb __kcsan_rmb
262#define kcsan_release __kcsan_release
264#define kcsan_mb() do { } while (0)
265#define kcsan_wmb() do { } while (0)
266#define kcsan_rmb() do { } while (0)
267#define kcsan_release() do { } while (0)
276#define __kcsan_check_read(ptr, size) __kcsan_check_access(ptr, size, 0)
284#define __kcsan_check_write(ptr, size) \
285 __kcsan_check_access(absolute_pointer(ptr), size, KCSAN_ACCESS_WRITE)
293#define __kcsan_check_read_write(ptr, size) \
294 __kcsan_check_access(ptr, size, KCSAN_ACCESS_COMPOUND | KCSAN_ACCESS_WRITE)
302#define kcsan_check_read(ptr, size) kcsan_check_access(ptr, size, 0)
310#define kcsan_check_write(ptr, size) \
311 kcsan_check_access(absolute_pointer(ptr), size, KCSAN_ACCESS_WRITE)
319#define kcsan_check_read_write(ptr, size) \
320 kcsan_check_access(ptr, size, KCSAN_ACCESS_COMPOUND | KCSAN_ACCESS_WRITE)
326#ifdef CONFIG_KCSAN_IGNORE_ATOMICS
327#define kcsan_check_atomic_read(...) do { } while (0)
328#define kcsan_check_atomic_write(...) do { } while (0)
329#define kcsan_check_atomic_read_write(...) do { } while (0)
331#define kcsan_check_atomic_read(ptr, size) \
332 kcsan_check_access(ptr, size, KCSAN_ACCESS_ATOMIC)
333#define kcsan_check_atomic_write(ptr, size) \
334 kcsan_check_access(absolute_pointer(ptr), size, KCSAN_ACCESS_ATOMIC | KCSAN_ACCESS_WRITE)
335#define kcsan_check_atomic_read_write(ptr, size) \
336 kcsan_check_access(ptr, size, KCSAN_ACCESS_ATOMIC | KCSAN_ACCESS_WRITE | KCSAN_ACCESS_COMPOUND)
370#define ASSERT_EXCLUSIVE_WRITER(var) \
371 __kcsan_check_access(&(var), sizeof(var), KCSAN_ACCESS_ASSERT)
378#define __kcsan_scoped_name(c, suffix) __kcsan_scoped_##c##suffix
379#define __ASSERT_EXCLUSIVE_SCOPED(var, type, id) \
380 struct kcsan_scoped_access __kcsan_scoped_name(id, _) \
381 __kcsan_cleanup_scoped; \
382 struct kcsan_scoped_access *__kcsan_scoped_name(id, _dummy_p) \
383 __maybe_unused = kcsan_begin_scoped_access( \
384 &(var), sizeof(var), KCSAN_ACCESS_SCOPED | (type), \
385 &__kcsan_scoped_name(id, _))
419#define ASSERT_EXCLUSIVE_WRITER_SCOPED(var) \
420 __ASSERT_EXCLUSIVE_SCOPED(var, KCSAN_ACCESS_ASSERT, __COUNTER__)
451#define ASSERT_EXCLUSIVE_ACCESS(var) \
452 __kcsan_check_access(&(var), sizeof(var), KCSAN_ACCESS_WRITE | KCSAN_ACCESS_ASSERT)
467#define ASSERT_EXCLUSIVE_ACCESS_SCOPED(var) \
468 __ASSERT_EXCLUSIVE_SCOPED(var, KCSAN_ACCESS_WRITE | KCSAN_ACCESS_ASSERT, __COUNTER__)
525#define ASSERT_EXCLUSIVE_BITS(var, mask) \
527 kcsan_set_access_mask(mask); \
528 __kcsan_check_access(&(var), sizeof(var), KCSAN_ACCESS_ASSERT);\
529 kcsan_set_access_mask(0); \
530 kcsan_atomic_next(1); \
XEProcessList * list
Definition main.cpp:27
size_t size
Definition drm_bridge.h:1299
Definition kcsan-checks.h:206