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_ */