Module Name: src
Committed By: maxv
Date: Thu Sep 5 16:19:17 UTC 2019
Modified Files:
src/sys/kern: subr_asan.c
src/sys/sys: atomic.h
Log Message:
Add KASAN instrumentation on the atomic functions. Use macros to simplify.
These macros are prerequisites for future changes.
To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/sys/kern/subr_asan.c
cvs rdiff -u -r1.13 -r1.14 src/sys/sys/atomic.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/kern/subr_asan.c
diff -u src/sys/kern/subr_asan.c:1.10 src/sys/kern/subr_asan.c:1.11
--- src/sys/kern/subr_asan.c:1.10 Sat Jun 15 06:40:34 2019
+++ src/sys/kern/subr_asan.c Thu Sep 5 16:19:16 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: subr_asan.c,v 1.10 2019/06/15 06:40:34 maxv Exp $ */
+/* $NetBSD: subr_asan.c,v 1.11 2019/09/05 16:19:16 maxv Exp $ */
/*
* Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_asan.c,v 1.10 2019/06/15 06:40:34 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_asan.c,v 1.11 2019/09/05 16:19:16 maxv Exp $");
#include <sys/param.h>
#include <sys/device.h>
@@ -551,6 +551,228 @@ kasan_copyoutstr(const void *kaddr, void
/* -------------------------------------------------------------------------- */
+#undef atomic_add_32
+#undef atomic_add_int
+#undef atomic_add_long
+#undef atomic_add_ptr
+#undef atomic_add_64
+#undef atomic_add_32_nv
+#undef atomic_add_int_nv
+#undef atomic_add_long_nv
+#undef atomic_add_ptr_nv
+#undef atomic_add_64_nv
+#undef atomic_and_32
+#undef atomic_and_uint
+#undef atomic_and_ulong
+#undef atomic_and_64
+#undef atomic_and_32_nv
+#undef atomic_and_uint_nv
+#undef atomic_and_ulong_nv
+#undef atomic_and_64_nv
+#undef atomic_or_32
+#undef atomic_or_uint
+#undef atomic_or_ulong
+#undef atomic_or_64
+#undef atomic_or_32_nv
+#undef atomic_or_uint_nv
+#undef atomic_or_ulong_nv
+#undef atomic_or_64_nv
+#undef atomic_cas_32
+#undef atomic_cas_uint
+#undef atomic_cas_ulong
+#undef atomic_cas_ptr
+#undef atomic_cas_64
+#undef atomic_cas_32_ni
+#undef atomic_cas_uint_ni
+#undef atomic_cas_ulong_ni
+#undef atomic_cas_ptr_ni
+#undef atomic_cas_64_ni
+#undef atomic_swap_32
+#undef atomic_swap_uint
+#undef atomic_swap_ulong
+#undef atomic_swap_ptr
+#undef atomic_swap_64
+#undef atomic_dec_32
+#undef atomic_dec_uint
+#undef atomic_dec_ulong
+#undef atomic_dec_ptr
+#undef atomic_dec_64
+#undef atomic_dec_32_nv
+#undef atomic_dec_uint_nv
+#undef atomic_dec_ulong_nv
+#undef atomic_dec_ptr_nv
+#undef atomic_dec_64_nv
+#undef atomic_inc_32
+#undef atomic_inc_uint
+#undef atomic_inc_ulong
+#undef atomic_inc_ptr
+#undef atomic_inc_64
+#undef atomic_inc_32_nv
+#undef atomic_inc_uint_nv
+#undef atomic_inc_ulong_nv
+#undef atomic_inc_ptr_nv
+#undef atomic_inc_64_nv
+
+#define ASAN_ATOMIC_FUNC_ADD(name, tret, targ1, targ2) \
+ void atomic_add_##name(volatile targ1 *, targ2); \
+ void kasan_atomic_add_##name(volatile targ1 *, targ2); \
+ void kasan_atomic_add_##name(volatile targ1 *ptr, targ2 val) \
+ { \
+ kasan_shadow_check((uintptr_t)ptr, sizeof(tret), true, \
+ __RET_ADDR); \
+ atomic_add_##name(ptr, val); \
+ } \
+ tret atomic_add_##name##_nv(volatile targ1 *, targ2); \
+ tret kasan_atomic_add_##name##_nv(volatile targ1 *, targ2); \
+ tret kasan_atomic_add_##name##_nv(volatile targ1 *ptr, targ2 val) \
+ { \
+ kasan_shadow_check((uintptr_t)ptr, sizeof(tret), true, \
+ __RET_ADDR); \
+ return atomic_add_##name##_nv(ptr, val); \
+ }
+
+#define ASAN_ATOMIC_FUNC_AND(name, tret, targ1, targ2) \
+ void atomic_and_##name(volatile targ1 *, targ2); \
+ void kasan_atomic_and_##name(volatile targ1 *, targ2); \
+ void kasan_atomic_and_##name(volatile targ1 *ptr, targ2 val) \
+ { \
+ kasan_shadow_check((uintptr_t)ptr, sizeof(tret), true, \
+ __RET_ADDR); \
+ atomic_and_##name(ptr, val); \
+ } \
+ tret atomic_and_##name##_nv(volatile targ1 *, targ2); \
+ tret kasan_atomic_and_##name##_nv(volatile targ1 *, targ2); \
+ tret kasan_atomic_and_##name##_nv(volatile targ1 *ptr, targ2 val) \
+ { \
+ kasan_shadow_check((uintptr_t)ptr, sizeof(tret), true, \
+ __RET_ADDR); \
+ return atomic_and_##name##_nv(ptr, val); \
+ }
+
+#define ASAN_ATOMIC_FUNC_OR(name, tret, targ1, targ2) \
+ void atomic_or_##name(volatile targ1 *, targ2); \
+ void kasan_atomic_or_##name(volatile targ1 *, targ2); \
+ void kasan_atomic_or_##name(volatile targ1 *ptr, targ2 val) \
+ { \
+ kasan_shadow_check((uintptr_t)ptr, sizeof(tret), true, \
+ __RET_ADDR); \
+ atomic_or_##name(ptr, val); \
+ } \
+ tret atomic_or_##name##_nv(volatile targ1 *, targ2); \
+ tret kasan_atomic_or_##name##_nv(volatile targ1 *, targ2); \
+ tret kasan_atomic_or_##name##_nv(volatile targ1 *ptr, targ2 val) \
+ { \
+ kasan_shadow_check((uintptr_t)ptr, sizeof(tret), true, \
+ __RET_ADDR); \
+ return atomic_or_##name##_nv(ptr, val); \
+ }
+
+#define ASAN_ATOMIC_FUNC_CAS(name, tret, targ1, targ2) \
+ tret atomic_cas_##name(volatile targ1 *, targ2, targ2); \
+ tret kasan_atomic_cas_##name(volatile targ1 *, targ2, targ2); \
+ tret kasan_atomic_cas_##name(volatile targ1 *ptr, targ2 exp, targ2 new) \
+ { \
+ kasan_shadow_check((uintptr_t)ptr, sizeof(tret), true, \
+ __RET_ADDR); \
+ return atomic_cas_##name(ptr, exp, new); \
+ } \
+ tret atomic_cas_##name##_ni(volatile targ1 *, targ2, targ2); \
+ tret kasan_atomic_cas_##name##_ni(volatile targ1 *, targ2, targ2); \
+ tret kasan_atomic_cas_##name##_ni(volatile targ1 *ptr, targ2 exp, targ2 new) \
+ { \
+ kasan_shadow_check((uintptr_t)ptr, sizeof(tret), true, \
+ __RET_ADDR); \
+ return atomic_cas_##name##_ni(ptr, exp, new); \
+ }
+
+#define ASAN_ATOMIC_FUNC_SWAP(name, tret, targ1, targ2) \
+ tret atomic_swap_##name(volatile targ1 *, targ2); \
+ tret kasan_atomic_swap_##name(volatile targ1 *, targ2); \
+ tret kasan_atomic_swap_##name(volatile targ1 *ptr, targ2 val) \
+ { \
+ kasan_shadow_check((uintptr_t)ptr, sizeof(tret), true, \
+ __RET_ADDR); \
+ return atomic_swap_##name(ptr, val); \
+ }
+
+#define ASAN_ATOMIC_FUNC_DEC(name, tret, targ1) \
+ void atomic_dec_##name(volatile targ1 *); \
+ void kasan_atomic_dec_##name(volatile targ1 *); \
+ void kasan_atomic_dec_##name(volatile targ1 *ptr) \
+ { \
+ kasan_shadow_check((uintptr_t)ptr, sizeof(tret), true, \
+ __RET_ADDR); \
+ atomic_dec_##name(ptr); \
+ } \
+ tret atomic_dec_##name##_nv(volatile targ1 *); \
+ tret kasan_atomic_dec_##name##_nv(volatile targ1 *); \
+ tret kasan_atomic_dec_##name##_nv(volatile targ1 *ptr) \
+ { \
+ kasan_shadow_check((uintptr_t)ptr, sizeof(tret), true, \
+ __RET_ADDR); \
+ return atomic_dec_##name##_nv(ptr); \
+ }
+
+#define ASAN_ATOMIC_FUNC_INC(name, tret, targ1) \
+ void atomic_inc_##name(volatile targ1 *); \
+ void kasan_atomic_inc_##name(volatile targ1 *); \
+ void kasan_atomic_inc_##name(volatile targ1 *ptr) \
+ { \
+ kasan_shadow_check((uintptr_t)ptr, sizeof(tret), true, \
+ __RET_ADDR); \
+ atomic_inc_##name(ptr); \
+ } \
+ tret atomic_inc_##name##_nv(volatile targ1 *); \
+ tret kasan_atomic_inc_##name##_nv(volatile targ1 *); \
+ tret kasan_atomic_inc_##name##_nv(volatile targ1 *ptr) \
+ { \
+ kasan_shadow_check((uintptr_t)ptr, sizeof(tret), true, \
+ __RET_ADDR); \
+ return atomic_inc_##name##_nv(ptr); \
+ }
+
+ASAN_ATOMIC_FUNC_ADD(32, uint32_t, uint32_t, int32_t);
+ASAN_ATOMIC_FUNC_ADD(64, uint64_t, uint64_t, int64_t);
+ASAN_ATOMIC_FUNC_ADD(int, unsigned int, unsigned int, int);
+ASAN_ATOMIC_FUNC_ADD(long, unsigned long, unsigned long, long);
+ASAN_ATOMIC_FUNC_ADD(ptr, void *, void, ssize_t);
+
+ASAN_ATOMIC_FUNC_AND(32, uint32_t, uint32_t, uint32_t);
+ASAN_ATOMIC_FUNC_AND(64, uint64_t, uint64_t, uint64_t);
+ASAN_ATOMIC_FUNC_AND(uint, unsigned int, unsigned int, unsigned int);
+ASAN_ATOMIC_FUNC_AND(ulong, unsigned long, unsigned long, unsigned long);
+
+ASAN_ATOMIC_FUNC_OR(32, uint32_t, uint32_t, uint32_t);
+ASAN_ATOMIC_FUNC_OR(64, uint64_t, uint64_t, uint64_t);
+ASAN_ATOMIC_FUNC_OR(uint, unsigned int, unsigned int, unsigned int);
+ASAN_ATOMIC_FUNC_OR(ulong, unsigned long, unsigned long, unsigned long);
+
+ASAN_ATOMIC_FUNC_CAS(32, uint32_t, uint32_t, uint32_t);
+ASAN_ATOMIC_FUNC_CAS(64, uint64_t, uint64_t, uint64_t);
+ASAN_ATOMIC_FUNC_CAS(uint, unsigned int, unsigned int, unsigned int);
+ASAN_ATOMIC_FUNC_CAS(ulong, unsigned long, unsigned long, unsigned long);
+ASAN_ATOMIC_FUNC_CAS(ptr, void *, void, void *);
+
+ASAN_ATOMIC_FUNC_SWAP(32, uint32_t, uint32_t, uint32_t);
+ASAN_ATOMIC_FUNC_SWAP(64, uint64_t, uint64_t, uint64_t);
+ASAN_ATOMIC_FUNC_SWAP(uint, unsigned int, unsigned int, unsigned int);
+ASAN_ATOMIC_FUNC_SWAP(ulong, unsigned long, unsigned long, unsigned long);
+ASAN_ATOMIC_FUNC_SWAP(ptr, void *, void, void *);
+
+ASAN_ATOMIC_FUNC_DEC(32, uint32_t, uint32_t)
+ASAN_ATOMIC_FUNC_DEC(64, uint64_t, uint64_t)
+ASAN_ATOMIC_FUNC_DEC(uint, unsigned int, unsigned int);
+ASAN_ATOMIC_FUNC_DEC(ulong, unsigned long, unsigned long);
+ASAN_ATOMIC_FUNC_DEC(ptr, void *, void);
+
+ASAN_ATOMIC_FUNC_INC(32, uint32_t, uint32_t)
+ASAN_ATOMIC_FUNC_INC(64, uint64_t, uint64_t)
+ASAN_ATOMIC_FUNC_INC(uint, unsigned int, unsigned int);
+ASAN_ATOMIC_FUNC_INC(ulong, unsigned long, unsigned long);
+ASAN_ATOMIC_FUNC_INC(ptr, void *, void);
+
+/* -------------------------------------------------------------------------- */
+
void __asan_register_globals(struct __asan_global *, size_t);
void __asan_unregister_globals(struct __asan_global *, size_t);
Index: src/sys/sys/atomic.h
diff -u src/sys/sys/atomic.h:1.13 src/sys/sys/atomic.h:1.14
--- src/sys/sys/atomic.h:1.13 Thu Jan 8 22:27:18 2015
+++ src/sys/sys/atomic.h Thu Sep 5 16:19:16 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic.h,v 1.13 2015/01/08 22:27:18 riastradh Exp $ */
+/* $NetBSD: atomic.h,v 1.14 2019/09/05 16:19:16 maxv Exp $ */
/*-
* Copyright (c) 2007, 2008 The NetBSD Foundation, Inc.
@@ -37,117 +37,104 @@
#include <stdint.h>
#endif
-__BEGIN_DECLS
-/*
- * Atomic ADD
- */
-void atomic_add_32(volatile uint32_t *, int32_t);
-void atomic_add_int(volatile unsigned int *, int);
-void atomic_add_long(volatile unsigned long *, long);
-void atomic_add_ptr(volatile void *, ssize_t);
-void atomic_add_64(volatile uint64_t *, int64_t);
-
-uint32_t atomic_add_32_nv(volatile uint32_t *, int32_t);
-unsigned int atomic_add_int_nv(volatile unsigned int *, int);
-unsigned long atomic_add_long_nv(volatile unsigned long *, long);
-void * atomic_add_ptr_nv(volatile void *, ssize_t);
-uint64_t atomic_add_64_nv(volatile uint64_t *, int64_t);
+#if defined(_KERNEL) && defined(_KERNEL_OPT)
+#include "opt_kasan.h"
+#endif
-/*
- * Atomic AND
- */
-void atomic_and_32(volatile uint32_t *, uint32_t);
-void atomic_and_uint(volatile unsigned int *, unsigned int);
-void atomic_and_ulong(volatile unsigned long *, unsigned long);
-void atomic_and_64(volatile uint64_t *, uint64_t);
-
-uint32_t atomic_and_32_nv(volatile uint32_t *, uint32_t);
-unsigned int atomic_and_uint_nv(volatile unsigned int *, unsigned int);
-unsigned long atomic_and_ulong_nv(volatile unsigned long *, unsigned long);
-uint64_t atomic_and_64_nv(volatile uint64_t *, uint64_t);
+#if defined(KASAN)
+#define ATOMIC_PROTO_ADD(name, tret, targ1, targ2) \
+ void kasan_atomic_add_##name(volatile targ1 *, targ2); \
+ tret kasan_atomic_add_##name##_nv(volatile targ1 *, targ2);
+#define ATOMIC_PROTO_AND(name, tret, targ1, targ2) \
+ void kasan_atomic_and_##name(volatile targ1 *, targ2); \
+ tret kasan_atomic_and_##name##_nv(volatile targ1 *, targ2);
+#define ATOMIC_PROTO_OR(name, tret, targ1, targ2) \
+ void kasan_atomic_or_##name(volatile targ1 *, targ2); \
+ tret kasan_atomic_or_##name##_nv(volatile targ1 *, targ2);
+#define ATOMIC_PROTO_CAS(name, tret, targ1, targ2) \
+ tret kasan_atomic_cas_##name(volatile targ1 *, targ2, targ2); \
+ tret kasan_atomic_cas_##name##_ni(volatile targ1 *, targ2, targ2);
+#define ATOMIC_PROTO_SWAP(name, tret, targ1, targ2) \
+ tret kasan_atomic_swap_##name(volatile targ1 *, targ2);
+#define ATOMIC_PROTO_DEC(name, tret, targ1) \
+ void kasan_atomic_dec_##name(volatile targ1 *); \
+ tret kasan_atomic_dec_##name##_nv(volatile targ1 *);
+#define ATOMIC_PROTO_INC(name, tret, targ1) \
+ void kasan_atomic_inc_##name(volatile targ1 *); \
+ tret kasan_atomic_inc_##name##_nv(volatile targ1 *);
+#else
+#define ATOMIC_PROTO_ADD(name, tret, targ1, targ2) \
+ void atomic_add_##name(volatile targ1 *, targ2); \
+ tret atomic_add_##name##_nv(volatile targ1 *, targ2);
+#define ATOMIC_PROTO_AND(name, tret, targ1, targ2) \
+ void atomic_and_##name(volatile targ1 *, targ2); \
+ tret atomic_and_##name##_nv(volatile targ1 *, targ2);
+#define ATOMIC_PROTO_OR(name, tret, targ1, targ2) \
+ void atomic_or_##name(volatile targ1 *, targ2); \
+ tret atomic_or_##name##_nv(volatile targ1 *, targ2);
+#define ATOMIC_PROTO_CAS(name, tret, targ1, targ2) \
+ tret atomic_cas_##name(volatile targ1 *, targ2, targ2); \
+ tret atomic_cas_##name##_ni(volatile targ1 *, targ2, targ2);
+#define ATOMIC_PROTO_SWAP(name, tret, targ1, targ2) \
+ tret atomic_swap_##name(volatile targ1 *, targ2);
+#define ATOMIC_PROTO_DEC(name, tret, targ1) \
+ void atomic_dec_##name(volatile targ1 *); \
+ tret atomic_dec_##name##_nv(volatile targ1 *);
+#define ATOMIC_PROTO_INC(name, tret, targ1) \
+ void atomic_inc_##name(volatile targ1 *); \
+ tret atomic_inc_##name##_nv(volatile targ1 *);
+#endif
-/*
- * Atomic OR
- */
-void atomic_or_32(volatile uint32_t *, uint32_t);
-void atomic_or_uint(volatile unsigned int *, unsigned int);
-void atomic_or_ulong(volatile unsigned long *, unsigned long);
-void atomic_or_64(volatile uint64_t *, uint64_t);
-
-uint32_t atomic_or_32_nv(volatile uint32_t *, uint32_t);
-unsigned int atomic_or_uint_nv(volatile unsigned int *, unsigned int);
-unsigned long atomic_or_ulong_nv(volatile unsigned long *, unsigned long);
-uint64_t atomic_or_64_nv(volatile uint64_t *, uint64_t);
+__BEGIN_DECLS
-/*
- * Atomic COMPARE-AND-SWAP
- */
-uint32_t atomic_cas_32(volatile uint32_t *, uint32_t, uint32_t);
-unsigned int atomic_cas_uint(volatile unsigned int *, unsigned int,
- unsigned int);
-unsigned long atomic_cas_ulong(volatile unsigned long *, unsigned long,
- unsigned long);
-void * atomic_cas_ptr(volatile void *, void *, void *);
-uint64_t atomic_cas_64(volatile uint64_t *, uint64_t, uint64_t);
+ATOMIC_PROTO_ADD(32, uint32_t, uint32_t, int32_t);
+ATOMIC_PROTO_ADD(64, uint64_t, uint64_t, int64_t);
+ATOMIC_PROTO_ADD(int, unsigned int, unsigned int, int);
+ATOMIC_PROTO_ADD(long, unsigned long, unsigned long, long);
+ATOMIC_PROTO_ADD(ptr, void *, void, ssize_t);
+
+ATOMIC_PROTO_AND(32, uint32_t, uint32_t, uint32_t);
+ATOMIC_PROTO_AND(64, uint64_t, uint64_t, uint64_t);
+ATOMIC_PROTO_AND(uint, unsigned int, unsigned int, unsigned int);
+ATOMIC_PROTO_AND(ulong, unsigned long, unsigned long, unsigned long);
+
+ATOMIC_PROTO_OR(32, uint32_t, uint32_t, uint32_t);
+ATOMIC_PROTO_OR(64, uint64_t, uint64_t, uint64_t);
+ATOMIC_PROTO_OR(uint, unsigned int, unsigned int, unsigned int);
+ATOMIC_PROTO_OR(ulong, unsigned long, unsigned long, unsigned long);
+
+ATOMIC_PROTO_CAS(32, uint32_t, uint32_t, uint32_t);
+ATOMIC_PROTO_CAS(64, uint64_t, uint64_t, uint64_t);
+ATOMIC_PROTO_CAS(uint, unsigned int, unsigned int, unsigned int);
+ATOMIC_PROTO_CAS(ulong, unsigned long, unsigned long, unsigned long);
+ATOMIC_PROTO_CAS(ptr, void *, void, void *);
+
+ATOMIC_PROTO_SWAP(32, uint32_t, uint32_t, uint32_t);
+ATOMIC_PROTO_SWAP(64, uint64_t, uint64_t, uint64_t);
+ATOMIC_PROTO_SWAP(uint, unsigned int, unsigned int, unsigned int);
+ATOMIC_PROTO_SWAP(ulong, unsigned long, unsigned long, unsigned long);
+ATOMIC_PROTO_SWAP(ptr, void *, void, void *);
+
+ATOMIC_PROTO_DEC(32, uint32_t, uint32_t)
+ATOMIC_PROTO_DEC(64, uint64_t, uint64_t)
+ATOMIC_PROTO_DEC(uint, unsigned int, unsigned int);
+ATOMIC_PROTO_DEC(ulong, unsigned long, unsigned long);
+ATOMIC_PROTO_DEC(ptr, void *, void);
+
+ATOMIC_PROTO_INC(32, uint32_t, uint32_t)
+ATOMIC_PROTO_INC(64, uint64_t, uint64_t)
+ATOMIC_PROTO_INC(uint, unsigned int, unsigned int);
+ATOMIC_PROTO_INC(ulong, unsigned long, unsigned long);
+ATOMIC_PROTO_INC(ptr, void *, void);
/*
- * This operations will be provided for userland, but may not be
+ * These operations will be provided for userland, but may not be
* implemented efficiently.
*/
uint16_t atomic_cas_16(volatile uint16_t *, uint16_t, uint16_t);
uint8_t atomic_cas_8(volatile uint8_t *, uint8_t, uint8_t);
/*
- * Non-interlocked atomic COMPARE-AND-SWAP.
- */
-uint32_t atomic_cas_32_ni(volatile uint32_t *, uint32_t, uint32_t);
-unsigned int atomic_cas_uint_ni(volatile unsigned int *, unsigned int,
- unsigned int);
-unsigned long atomic_cas_ulong_ni(volatile unsigned long *, unsigned long,
- unsigned long);
-void * atomic_cas_ptr_ni(volatile void *, void *, void *);
-uint64_t atomic_cas_64_ni(volatile uint64_t *, uint64_t, uint64_t);
-
-/*
- * Atomic SWAP
- */
-uint32_t atomic_swap_32(volatile uint32_t *, uint32_t);
-unsigned int atomic_swap_uint(volatile unsigned int *, unsigned int);
-unsigned long atomic_swap_ulong(volatile unsigned long *, unsigned long);
-void * atomic_swap_ptr(volatile void *, void *);
-uint64_t atomic_swap_64(volatile uint64_t *, uint64_t);
-
-/*
- * Atomic DECREMENT
- */
-void atomic_dec_32(volatile uint32_t *);
-void atomic_dec_uint(volatile unsigned int *);
-void atomic_dec_ulong(volatile unsigned long *);
-void atomic_dec_ptr(volatile void *);
-void atomic_dec_64(volatile uint64_t *);
-
-uint32_t atomic_dec_32_nv(volatile uint32_t *);
-unsigned int atomic_dec_uint_nv(volatile unsigned int *);
-unsigned long atomic_dec_ulong_nv(volatile unsigned long *);
-void * atomic_dec_ptr_nv(volatile void *);
-uint64_t atomic_dec_64_nv(volatile uint64_t *);
-
-/*
- * Atomic INCREMENT
- */
-void atomic_inc_32(volatile uint32_t *);
-void atomic_inc_uint(volatile unsigned int *);
-void atomic_inc_ulong(volatile unsigned long *);
-void atomic_inc_ptr(volatile void *);
-void atomic_inc_64(volatile uint64_t *);
-
-uint32_t atomic_inc_32_nv(volatile uint32_t *);
-unsigned int atomic_inc_uint_nv(volatile unsigned int *);
-unsigned long atomic_inc_ulong_nv(volatile unsigned long *);
-void * atomic_inc_ptr_nv(volatile void *);
-uint64_t atomic_inc_64_nv(volatile uint64_t *);
-
-/*
* Memory barrier operations
*/
void membar_enter(void);
@@ -164,4 +151,68 @@ void membar_datadep_consumer(void);
__END_DECLS
+#if defined(KASAN)
+#define atomic_add_32 kasan_atomic_add_32
+#define atomic_add_int kasan_atomic_add_int
+#define atomic_add_long kasan_atomic_add_long
+#define atomic_add_ptr kasan_atomic_add_ptr
+#define atomic_add_64 kasan_atomic_add_64
+#define atomic_add_32_nv kasan_atomic_add_32_nv
+#define atomic_add_int_nv kasan_atomic_add_int_nv
+#define atomic_add_long_nv kasan_atomic_add_long_nv
+#define atomic_add_ptr_nv kasan_atomic_add_ptr_nv
+#define atomic_add_64_nv kasan_atomic_add_64_nv
+#define atomic_and_32 kasan_atomic_and_32
+#define atomic_and_uint kasan_atomic_and_uint
+#define atomic_and_ulong kasan_atomic_and_ulong
+#define atomic_and_64 kasan_atomic_and_64
+#define atomic_and_32_nv kasan_atomic_and_32_nv
+#define atomic_and_uint_nv kasan_atomic_and_uint_nv
+#define atomic_and_ulong_nv kasan_atomic_and_ulong_nv
+#define atomic_and_64_nv kasan_atomic_and_64_nv
+#define atomic_or_32 kasan_atomic_or_32
+#define atomic_or_uint kasan_atomic_or_uint
+#define atomic_or_ulong kasan_atomic_or_ulong
+#define atomic_or_64 kasan_atomic_or_64
+#define atomic_or_32_nv kasan_atomic_or_32_nv
+#define atomic_or_uint_nv kasan_atomic_or_uint_nv
+#define atomic_or_ulong_nv kasan_atomic_or_ulong_nv
+#define atomic_or_64_nv kasan_atomic_or_64_nv
+#define atomic_cas_32 kasan_atomic_cas_32
+#define atomic_cas_uint kasan_atomic_cas_uint
+#define atomic_cas_ulong kasan_atomic_cas_ulong
+#define atomic_cas_ptr kasan_atomic_cas_ptr
+#define atomic_cas_64 kasan_atomic_cas_64
+#define atomic_cas_32_ni kasan_atomic_cas_32_ni
+#define atomic_cas_uint_ni kasan_atomic_cas_uint_ni
+#define atomic_cas_ulong_ni kasan_atomic_cas_ulong_ni
+#define atomic_cas_ptr_ni kasan_atomic_cas_ptr_ni
+#define atomic_cas_64_ni kasan_atomic_cas_64_ni
+#define atomic_swap_32 kasan_atomic_swap_32
+#define atomic_swap_uint kasan_atomic_swap_uint
+#define atomic_swap_ulong kasan_atomic_swap_ulong
+#define atomic_swap_ptr kasan_atomic_swap_ptr
+#define atomic_swap_64 kasan_atomic_swap_64
+#define atomic_dec_32 kasan_atomic_dec_32
+#define atomic_dec_uint kasan_atomic_dec_uint
+#define atomic_dec_ulong kasan_atomic_dec_ulong
+#define atomic_dec_ptr kasan_atomic_dec_ptr
+#define atomic_dec_64 kasan_atomic_dec_64
+#define atomic_dec_32_nv kasan_atomic_dec_32_nv
+#define atomic_dec_uint_nv kasan_atomic_dec_uint_nv
+#define atomic_dec_ulong_nv kasan_atomic_dec_ulong_nv
+#define atomic_dec_ptr_nv kasan_atomic_dec_ptr_nv
+#define atomic_dec_64_nv kasan_atomic_dec_64_nv
+#define atomic_inc_32 kasan_atomic_inc_32
+#define atomic_inc_uint kasan_atomic_inc_uint
+#define atomic_inc_ulong kasan_atomic_inc_ulong
+#define atomic_inc_ptr kasan_atomic_inc_ptr
+#define atomic_inc_64 kasan_atomic_inc_64
+#define atomic_inc_32_nv kasan_atomic_inc_32_nv
+#define atomic_inc_uint_nv kasan_atomic_inc_uint_nv
+#define atomic_inc_ulong_nv kasan_atomic_inc_ulong_nv
+#define atomic_inc_ptr_nv kasan_atomic_inc_ptr_nv
+#define atomic_inc_64_nv kasan_atomic_inc_64_nv
+#endif
+
#endif /* ! _SYS_ATOMIC_H_ */