1/*- 2 * SPDX-License-Identifier: BSD-2-Clause 3 * 4 * Copyright (c) 2019 Andrew Turner 5 * Copyright (c) 2021 The FreeBSD Foundation 6 * 7 * This software was developed by SRI International and the University of 8 * Cambridge Computer Laboratory (Department of Computer Science and 9 * Technology) under DARPA contract HR0011-18-C-0016 ("ECATS"), as part of the 10 * DARPA SSITH research programme. 11 * 12 * Portions of this software were written by Mark Johnston under sponsorship 13 * by the FreeBSD Foundation. 14 * 15 * Redistribution and use in source and binary forms, with or without 16 * modification, are permitted provided that the following conditions 17 * are met: 18 * 1. Redistributions of source code must retain the above copyright 19 * notice, this list of conditions and the following disclaimer. 20 * 2. Redistributions in binary form must reproduce the above copyright 21 * notice, this list of conditions and the following disclaimer in the 22 * documentation and/or other materials provided with the distribution. 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 */ 36 37#ifndef _SYS_ATOMIC_SAN_H_ 38#define _SYS_ATOMIC_SAN_H_ 39 40#ifndef _MACHINE_ATOMIC_H_ 41#error do not include this header, use machine/atomic.h 42#endif 43 44#include <sys/types.h> 45 46#define ATOMIC_SAN_FUNC_1(sp, op, name, type) \ 47 void sp##_atomic_##op##_##name(volatile type *, type); \ 48 void sp##_atomic_##op##_acq_##name(volatile type *, type); \ 49 void sp##_atomic_##op##_rel_##name(volatile type *, type) 50 51#define ATOMIC_SAN_CMPSET(sp, name, type) \ 52 int sp##_atomic_cmpset_##name(volatile type *, type, type); \ 53 int sp##_atomic_cmpset_acq_##name(volatile type *, type, type); \ 54 int sp##_atomic_cmpset_rel_##name(volatile type *, type, type) 55 56#define ATOMIC_SAN_FCMPSET(sp, name, type) \ 57 int sp##_atomic_fcmpset_##name(volatile type *, type *, type); \ 58 int sp##_atomic_fcmpset_acq_##name(volatile type *, type *, type); \ 59 int sp##_atomic_fcmpset_rel_##name(volatile type *, type *, type) 60 61#define ATOMIC_SAN_READ(sp, op, name, type) \ 62 type sp##_atomic_##op##_##name(volatile type *, type) 63 64#define ATOMIC_SAN_READANDCLEAR(sp, name, type) \ 65 type sp##_atomic_readandclear_##name(volatile type *) 66 67#define ATOMIC_SAN_LOAD(sp, name, type) \ 68 type sp##_atomic_load_##name(volatile type *) 69 70#define ATOMIC_SAN_LOAD_ACQ(sp, name, type) \ 71 type sp##_atomic_load_acq_##name(volatile type *) 72 73#define ATOMIC_SAN_STORE(sp, name, type) \ 74 void sp##_atomic_store_##name(volatile type *, type) 75 76#define ATOMIC_SAN_STORE_REL(sp, name, type) \ 77 void sp##_atomic_store_rel_##name(volatile type *, type) 78 79#define ATOMIC_SAN_TEST(sp, op, name, type) \ 80 int sp##_atomic_##op##_##name(volatile type *, u_int); \ 81 int sp##_atomic_##op##_acq_##name(volatile type *, u_int) 82 83#define _ATOMIC_SAN_THREAD_FENCE(sp) \ 84 void sp##_atomic_thread_fence_acq(void); \ 85 void sp##_atomic_thread_fence_rel(void); \ 86 void sp##_atomic_thread_fence_acq_rel(void); \ 87 void sp##_atomic_thread_fence_seq_cst(void); \ 88 void sp##_atomic_interrupt_fence(void) 89 90#define ATOMIC_SAN_THREAD_FENCE(sp) \ 91 _ATOMIC_SAN_THREAD_FENCE(sp) 92 93#define ATOMIC_SAN_LOAD_STORE(sp, name, type) \ 94 ATOMIC_SAN_LOAD(sp, name, type); \ 95 ATOMIC_SAN_STORE(sp, name, type) 96 97#define _ATOMIC_SAN_FUNCS(sp, name, type) \ 98 ATOMIC_SAN_FUNC_1(sp, add, name, type); \ 99 ATOMIC_SAN_FUNC_1(sp, clear, name, type); \ 100 ATOMIC_SAN_CMPSET(sp, name, type); \ 101 ATOMIC_SAN_FCMPSET(sp, name, type); \ 102 ATOMIC_SAN_READ(sp, fetchadd, name, type); \ 103 ATOMIC_SAN_LOAD(sp, name, type); \ 104 ATOMIC_SAN_LOAD_ACQ(sp, name, type); \ 105 ATOMIC_SAN_READANDCLEAR(sp, name, type); \ 106 ATOMIC_SAN_FUNC_1(sp, set, name, type); \ 107 ATOMIC_SAN_FUNC_1(sp, subtract, name, type); \ 108 ATOMIC_SAN_STORE(sp, name, type); \ 109 ATOMIC_SAN_STORE_REL(sp, name, type); \ 110 ATOMIC_SAN_READ(sp, swap, name, type); \ 111 ATOMIC_SAN_TEST(sp, testandclear, name, type); \ 112 ATOMIC_SAN_TEST(sp, testandset, name, type) 113 114#define ATOMIC_SAN_FUNCS(name, type) \ 115 _ATOMIC_SAN_FUNCS(SAN_INTERCEPTOR_PREFIX, name, type) 116 117ATOMIC_SAN_FUNCS(char, uint8_t); 118ATOMIC_SAN_FUNCS(short, uint16_t); 119ATOMIC_SAN_FUNCS(int, u_int); 120ATOMIC_SAN_FUNCS(long, u_long); 121ATOMIC_SAN_FUNCS(ptr, uintptr_t); 122ATOMIC_SAN_FUNCS(8, uint8_t); 123ATOMIC_SAN_FUNCS(16, uint16_t); 124ATOMIC_SAN_FUNCS(32, uint32_t); 125ATOMIC_SAN_FUNCS(64, uint64_t); 126ATOMIC_SAN_LOAD_STORE(SAN_INTERCEPTOR_PREFIX, bool, bool); 127ATOMIC_SAN_THREAD_FENCE(SAN_INTERCEPTOR_PREFIX); 128 129#ifndef SAN_RUNTIME 130 131/* 132 * Redirect uses of an atomic(9) function to the sanitizer's interceptor. 133 * For instance, KASAN callers of atomic_add_char() will be redirected to 134 * kasan_atomic_add_char(). 135 */ 136#define ATOMIC_SAN(func) \ 137 __CONCAT(SAN_INTERCEPTOR_PREFIX, __CONCAT(_atomic_, func)) 138 139#define atomic_load_bool ATOMIC_SAN(load_bool) 140#define atomic_store_bool ATOMIC_SAN(store_bool) 141 142#define atomic_add_char ATOMIC_SAN(add_char) 143#define atomic_add_acq_char ATOMIC_SAN(add_acq_char) 144#define atomic_add_rel_char ATOMIC_SAN(add_rel_char) 145#define atomic_clear_char ATOMIC_SAN(clear_char) 146#define atomic_clear_acq_char ATOMIC_SAN(clear_acq_char) 147#define atomic_clear_rel_char ATOMIC_SAN(clear_rel_char) 148#define atomic_cmpset_char ATOMIC_SAN(cmpset_char) 149#define atomic_cmpset_acq_char ATOMIC_SAN(cmpset_acq_char) 150#define atomic_cmpset_rel_char ATOMIC_SAN(cmpset_rel_char) 151#define atomic_fcmpset_char ATOMIC_SAN(fcmpset_char) 152#define atomic_fcmpset_acq_char ATOMIC_SAN(fcmpset_acq_char) 153#define atomic_fcmpset_rel_char ATOMIC_SAN(fcmpset_rel_char) 154#define atomic_fetchadd_char ATOMIC_SAN(fetchadd_char) 155#define atomic_load_char ATOMIC_SAN(load_char) 156#define atomic_load_acq_char ATOMIC_SAN(load_acq_char) 157#define atomic_readandclear_char ATOMIC_SAN(readandclear_char) 158#define atomic_set_char ATOMIC_SAN(set_char) 159#define atomic_set_acq_char ATOMIC_SAN(set_acq_char) 160#define atomic_set_rel_char ATOMIC_SAN(set_rel_char) 161#define atomic_subtract_char ATOMIC_SAN(subtract_char) 162#define atomic_subtract_acq_char ATOMIC_SAN(subtract_acq_char) 163#define atomic_subtract_rel_char ATOMIC_SAN(subtract_rel_char) 164#define atomic_store_char ATOMIC_SAN(store_char) 165#define atomic_store_rel_char ATOMIC_SAN(store_rel_char) 166#define atomic_swap_char ATOMIC_SAN(swap_char) 167#define atomic_testandclear_char ATOMIC_SAN(testandclear_char) 168#define atomic_testandset_char ATOMIC_SAN(testandset_char) 169 170#define atomic_add_short ATOMIC_SAN(add_short) 171#define atomic_add_acq_short ATOMIC_SAN(add_acq_short) 172#define atomic_add_rel_short ATOMIC_SAN(add_rel_short) 173#define atomic_clear_short ATOMIC_SAN(clear_short) 174#define atomic_clear_acq_short ATOMIC_SAN(clear_acq_short) 175#define atomic_clear_rel_short ATOMIC_SAN(clear_rel_short) 176#define atomic_cmpset_short ATOMIC_SAN(cmpset_short) 177#define atomic_cmpset_acq_short ATOMIC_SAN(cmpset_acq_short) 178#define atomic_cmpset_rel_short ATOMIC_SAN(cmpset_rel_short) 179#define atomic_fcmpset_short ATOMIC_SAN(fcmpset_short) 180#define atomic_fcmpset_acq_short ATOMIC_SAN(fcmpset_acq_short) 181#define atomic_fcmpset_rel_short ATOMIC_SAN(fcmpset_rel_short) 182#define atomic_fetchadd_short ATOMIC_SAN(fetchadd_short) 183#define atomic_load_short ATOMIC_SAN(load_short) 184#define atomic_load_acq_short ATOMIC_SAN(load_acq_short) 185#define atomic_readandclear_short ATOMIC_SAN(readandclear_short) 186#define atomic_set_short ATOMIC_SAN(set_short) 187#define atomic_set_acq_short ATOMIC_SAN(set_acq_short) 188#define atomic_set_rel_short ATOMIC_SAN(set_rel_short) 189#define atomic_subtract_short ATOMIC_SAN(subtract_short) 190#define atomic_subtract_acq_short ATOMIC_SAN(subtract_acq_short) 191#define atomic_subtract_rel_short ATOMIC_SAN(subtract_rel_short) 192#define atomic_store_short ATOMIC_SAN(store_short) 193#define atomic_store_rel_short ATOMIC_SAN(store_rel_short) 194#define atomic_swap_short ATOMIC_SAN(swap_short) 195#define atomic_testandclear_short ATOMIC_SAN(testandclear_short) 196#define atomic_testandset_short ATOMIC_SAN(testandset_short) 197 198#define atomic_add_int ATOMIC_SAN(add_int) 199#define atomic_add_acq_int ATOMIC_SAN(add_acq_int) 200#define atomic_add_rel_int ATOMIC_SAN(add_rel_int) 201#define atomic_clear_int ATOMIC_SAN(clear_int) 202#define atomic_clear_acq_int ATOMIC_SAN(clear_acq_int) 203#define atomic_clear_rel_int ATOMIC_SAN(clear_rel_int) 204#define atomic_cmpset_int ATOMIC_SAN(cmpset_int) 205#define atomic_cmpset_acq_int ATOMIC_SAN(cmpset_acq_int) 206#define atomic_cmpset_rel_int ATOMIC_SAN(cmpset_rel_int) 207#define atomic_fcmpset_int ATOMIC_SAN(fcmpset_int) 208#define atomic_fcmpset_acq_int ATOMIC_SAN(fcmpset_acq_int) 209#define atomic_fcmpset_rel_int ATOMIC_SAN(fcmpset_rel_int) 210#define atomic_fetchadd_int ATOMIC_SAN(fetchadd_int) 211#define atomic_load_int ATOMIC_SAN(load_int) 212#define atomic_load_acq_int ATOMIC_SAN(load_acq_int) 213#define atomic_readandclear_int ATOMIC_SAN(readandclear_int) 214#define atomic_set_int ATOMIC_SAN(set_int) 215#define atomic_set_acq_int ATOMIC_SAN(set_acq_int) 216#define atomic_set_rel_int ATOMIC_SAN(set_rel_int) 217#define atomic_subtract_int ATOMIC_SAN(subtract_int) 218#define atomic_subtract_acq_int ATOMIC_SAN(subtract_acq_int) 219#define atomic_subtract_rel_int ATOMIC_SAN(subtract_rel_int) 220#define atomic_store_int ATOMIC_SAN(store_int) 221#define atomic_store_rel_int ATOMIC_SAN(store_rel_int) 222#define atomic_swap_int ATOMIC_SAN(swap_int) 223#define atomic_testandclear_int ATOMIC_SAN(testandclear_int) 224#define atomic_testandset_int ATOMIC_SAN(testandset_int) 225 226#define atomic_add_long ATOMIC_SAN(add_long) 227#define atomic_add_acq_long ATOMIC_SAN(add_acq_long) 228#define atomic_add_rel_long ATOMIC_SAN(add_rel_long) 229#define atomic_clear_long ATOMIC_SAN(clear_long) 230#define atomic_clear_acq_long ATOMIC_SAN(clear_acq_long) 231#define atomic_clear_rel_long ATOMIC_SAN(clear_rel_long) 232#define atomic_cmpset_long ATOMIC_SAN(cmpset_long) 233#define atomic_cmpset_acq_long ATOMIC_SAN(cmpset_acq_long) 234#define atomic_cmpset_rel_long ATOMIC_SAN(cmpset_rel_long) 235#define atomic_fcmpset_long ATOMIC_SAN(fcmpset_long) 236#define atomic_fcmpset_acq_long ATOMIC_SAN(fcmpset_acq_long) 237#define atomic_fcmpset_rel_long ATOMIC_SAN(fcmpset_rel_long) 238#define atomic_fetchadd_long ATOMIC_SAN(fetchadd_long) 239#define atomic_load_long ATOMIC_SAN(load_long) 240#define atomic_load_acq_long ATOMIC_SAN(load_acq_long) 241#define atomic_readandclear_long ATOMIC_SAN(readandclear_long) 242#define atomic_set_long ATOMIC_SAN(set_long) 243#define atomic_set_acq_long ATOMIC_SAN(set_acq_long) 244#define atomic_set_rel_long ATOMIC_SAN(set_rel_long) 245#define atomic_subtract_long ATOMIC_SAN(subtract_long) 246#define atomic_subtract_acq_long ATOMIC_SAN(subtract_acq_long) 247#define atomic_subtract_rel_long ATOMIC_SAN(subtract_rel_long) 248#define atomic_store_long ATOMIC_SAN(store_long) 249#define atomic_store_rel_long ATOMIC_SAN(store_rel_long) 250#define atomic_swap_long ATOMIC_SAN(swap_long) 251#define atomic_testandclear_long ATOMIC_SAN(testandclear_long) 252#define atomic_testandset_long ATOMIC_SAN(testandset_long) 253#define atomic_testandset_acq_long ATOMIC_SAN(testandset_acq_long) 254 255#define atomic_add_ptr ATOMIC_SAN(add_ptr) 256#define atomic_add_acq_ptr ATOMIC_SAN(add_acq_ptr) 257#define atomic_add_rel_ptr ATOMIC_SAN(add_rel_ptr) 258#define atomic_clear_ptr ATOMIC_SAN(clear_ptr) 259#define atomic_clear_acq_ptr ATOMIC_SAN(clear_acq_ptr) 260#define atomic_clear_rel_ptr ATOMIC_SAN(clear_rel_ptr) 261#define atomic_cmpset_ptr ATOMIC_SAN(cmpset_ptr) 262#define atomic_cmpset_acq_ptr ATOMIC_SAN(cmpset_acq_ptr) 263#define atomic_cmpset_rel_ptr ATOMIC_SAN(cmpset_rel_ptr) 264#define atomic_fcmpset_ptr ATOMIC_SAN(fcmpset_ptr) 265#define atomic_fcmpset_acq_ptr ATOMIC_SAN(fcmpset_acq_ptr) 266#define atomic_fcmpset_rel_ptr ATOMIC_SAN(fcmpset_rel_ptr) 267#define atomic_fetchadd_ptr ATOMIC_SAN(fetchadd_ptr) 268#define atomic_load_ptr(x) \ 269 ((void *)ATOMIC_SAN(load_ptr)(__DECONST(volatile uintptr_t *, (x)))) 270#define atomic_load_acq_ptr ATOMIC_SAN(load_acq_ptr) 271#define atomic_load_consume_ptr(x) \ 272 ((void *)atomic_load_acq_ptr((volatile uintptr_t *)(x))) 273#define atomic_readandclear_ptr ATOMIC_SAN(readandclear_ptr) 274#define atomic_set_ptr ATOMIC_SAN(set_ptr) 275#define atomic_set_acq_ptr ATOMIC_SAN(set_acq_ptr) 276#define atomic_set_rel_ptr ATOMIC_SAN(set_rel_ptr) 277#define atomic_subtract_ptr ATOMIC_SAN(subtract_ptr) 278#define atomic_subtract_acq_ptr ATOMIC_SAN(subtract_acq_ptr) 279#define atomic_subtract_rel_ptr ATOMIC_SAN(subtract_rel_ptr) 280#define atomic_store_ptr(x, v) ({ \ 281 __typeof(*x) __value = (v); \ 282 ATOMIC_SAN(store_ptr)((volatile uintptr_t *)(x), (uintptr_t)(__value));\ 283}) 284#define atomic_store_rel_ptr ATOMIC_SAN(store_rel_ptr) 285#define atomic_swap_ptr ATOMIC_SAN(swap_ptr) 286#define atomic_testandclear_ptr ATOMIC_SAN(testandclear_ptr) 287#define atomic_testandset_ptr ATOMIC_SAN(testandset_ptr) 288 289#define atomic_add_8 ATOMIC_SAN(add_8) 290#define atomic_add_acq_8 ATOMIC_SAN(add_acq_8) 291#define atomic_add_rel_8 ATOMIC_SAN(add_rel_8) 292#define atomic_clear_8 ATOMIC_SAN(clear_8) 293#define atomic_clear_acq_8 ATOMIC_SAN(clear_acq_8) 294#define atomic_clear_rel_8 ATOMIC_SAN(clear_rel_8) 295#define atomic_cmpset_8 ATOMIC_SAN(cmpset_8) 296#define atomic_cmpset_acq_8 ATOMIC_SAN(cmpset_acq_8) 297#define atomic_cmpset_rel_8 ATOMIC_SAN(cmpset_rel_8) 298#define atomic_fcmpset_8 ATOMIC_SAN(fcmpset_8) 299#define atomic_fcmpset_acq_8 ATOMIC_SAN(fcmpset_acq_8) 300#define atomic_fcmpset_rel_8 ATOMIC_SAN(fcmpset_rel_8) 301#define atomic_fetchadd_8 ATOMIC_SAN(fetchadd_8) 302#define atomic_load_8 ATOMIC_SAN(load_8) 303#define atomic_load_acq_8 ATOMIC_SAN(load_acq_8) 304#define atomic_readandclear_8 ATOMIC_SAN(readandclear_8) 305#define atomic_set_8 ATOMIC_SAN(set_8) 306#define atomic_set_acq_8 ATOMIC_SAN(set_acq_8) 307#define atomic_set_rel_8 ATOMIC_SAN(set_rel_8) 308#define atomic_subtract_8 ATOMIC_SAN(subtract_8) 309#define atomic_subtract_acq_8 ATOMIC_SAN(subtract_acq_8) 310#define atomic_subtract_rel_8 ATOMIC_SAN(subtract_rel_8) 311#define atomic_store_8 ATOMIC_SAN(store_8) 312#define atomic_store_rel_8 ATOMIC_SAN(store_rel_8) 313#define atomic_swap_8 ATOMIC_SAN(swap_8) 314#define atomic_testandclear_8 ATOMIC_SAN(testandclear_8) 315#define atomic_testandset_8 ATOMIC_SAN(testandset_8) 316 317#define atomic_add_16 ATOMIC_SAN(add_16) 318#define atomic_add_acq_16 ATOMIC_SAN(add_acq_16) 319#define atomic_add_rel_16 ATOMIC_SAN(add_rel_16) 320#define atomic_clear_16 ATOMIC_SAN(clear_16) 321#define atomic_clear_acq_16 ATOMIC_SAN(clear_acq_16) 322#define atomic_clear_rel_16 ATOMIC_SAN(clear_rel_16) 323#define atomic_cmpset_16 ATOMIC_SAN(cmpset_16) 324#define atomic_cmpset_acq_16 ATOMIC_SAN(cmpset_acq_16) 325#define atomic_cmpset_rel_16 ATOMIC_SAN(cmpset_rel_16) 326#define atomic_fcmpset_16 ATOMIC_SAN(fcmpset_16) 327#define atomic_fcmpset_acq_16 ATOMIC_SAN(fcmpset_acq_16) 328#define atomic_fcmpset_rel_16 ATOMIC_SAN(fcmpset_rel_16) 329#define atomic_fetchadd_16 ATOMIC_SAN(fetchadd_16) 330#define atomic_load_16 ATOMIC_SAN(load_16) 331#define atomic_load_acq_16 ATOMIC_SAN(load_acq_16) 332#define atomic_readandclear_16 ATOMIC_SAN(readandclear_16) 333#define atomic_set_16 ATOMIC_SAN(set_16) 334#define atomic_set_acq_16 ATOMIC_SAN(set_acq_16) 335#define atomic_set_rel_16 ATOMIC_SAN(set_rel_16) 336#define atomic_subtract_16 ATOMIC_SAN(subtract_16) 337#define atomic_subtract_acq_16 ATOMIC_SAN(subtract_acq_16) 338#define atomic_subtract_rel_16 ATOMIC_SAN(subtract_rel_16) 339#define atomic_store_16 ATOMIC_SAN(store_16) 340#define atomic_store_rel_16 ATOMIC_SAN(store_rel_16) 341#define atomic_swap_16 ATOMIC_SAN(swap_16) 342#define atomic_testandclear_16 ATOMIC_SAN(testandclear_16) 343#define atomic_testandset_16 ATOMIC_SAN(testandset_16) 344 345#define atomic_add_32 ATOMIC_SAN(add_32) 346#define atomic_add_acq_32 ATOMIC_SAN(add_acq_32) 347#define atomic_add_rel_32 ATOMIC_SAN(add_rel_32) 348#define atomic_clear_32 ATOMIC_SAN(clear_32) 349#define atomic_clear_acq_32 ATOMIC_SAN(clear_acq_32) 350#define atomic_clear_rel_32 ATOMIC_SAN(clear_rel_32) 351#define atomic_cmpset_32 ATOMIC_SAN(cmpset_32) 352#define atomic_cmpset_acq_32 ATOMIC_SAN(cmpset_acq_32) 353#define atomic_cmpset_rel_32 ATOMIC_SAN(cmpset_rel_32) 354#define atomic_fcmpset_32 ATOMIC_SAN(fcmpset_32) 355#define atomic_fcmpset_acq_32 ATOMIC_SAN(fcmpset_acq_32) 356#define atomic_fcmpset_rel_32 ATOMIC_SAN(fcmpset_rel_32) 357#define atomic_fetchadd_32 ATOMIC_SAN(fetchadd_32) 358#define atomic_load_32 ATOMIC_SAN(load_32) 359#define atomic_load_acq_32 ATOMIC_SAN(load_acq_32) 360#define atomic_readandclear_32 ATOMIC_SAN(readandclear_32) 361#define atomic_set_32 ATOMIC_SAN(set_32) 362#define atomic_set_acq_32 ATOMIC_SAN(set_acq_32) 363#define atomic_set_rel_32 ATOMIC_SAN(set_rel_32) 364#define atomic_subtract_32 ATOMIC_SAN(subtract_32) 365#define atomic_subtract_acq_32 ATOMIC_SAN(subtract_acq_32) 366#define atomic_subtract_rel_32 ATOMIC_SAN(subtract_rel_32) 367#define atomic_store_32 ATOMIC_SAN(store_32) 368#define atomic_store_rel_32 ATOMIC_SAN(store_rel_32) 369#define atomic_swap_32 ATOMIC_SAN(swap_32) 370#define atomic_testandclear_32 ATOMIC_SAN(testandclear_32) 371#define atomic_testandset_32 ATOMIC_SAN(testandset_32) 372 373#define atomic_add_64 ATOMIC_SAN(add_64) 374#define atomic_add_acq_64 ATOMIC_SAN(add_acq_64) 375#define atomic_add_rel_64 ATOMIC_SAN(add_rel_64) 376#define atomic_clear_64 ATOMIC_SAN(clear_64) 377#define atomic_clear_acq_64 ATOMIC_SAN(clear_acq_64) 378#define atomic_clear_rel_64 ATOMIC_SAN(clear_rel_64) 379#define atomic_cmpset_64 ATOMIC_SAN(cmpset_64) 380#define atomic_cmpset_acq_64 ATOMIC_SAN(cmpset_acq_64) 381#define atomic_cmpset_rel_64 ATOMIC_SAN(cmpset_rel_64) 382#define atomic_fcmpset_64 ATOMIC_SAN(fcmpset_64) 383#define atomic_fcmpset_acq_64 ATOMIC_SAN(fcmpset_acq_64) 384#define atomic_fcmpset_rel_64 ATOMIC_SAN(fcmpset_rel_64) 385#define atomic_fetchadd_64 ATOMIC_SAN(fetchadd_64) 386#define atomic_load_64 ATOMIC_SAN(load_64) 387#define atomic_load_acq_64 ATOMIC_SAN(load_acq_64) 388#define atomic_readandclear_64 ATOMIC_SAN(readandclear_64) 389#define atomic_set_64 ATOMIC_SAN(set_64) 390#define atomic_set_acq_64 ATOMIC_SAN(set_acq_64) 391#define atomic_set_rel_64 ATOMIC_SAN(set_rel_64) 392#define atomic_subtract_64 ATOMIC_SAN(subtract_64) 393#define atomic_subtract_acq_64 ATOMIC_SAN(subtract_acq_64) 394#define atomic_subtract_rel_64 ATOMIC_SAN(subtract_rel_64) 395#define atomic_store_64 ATOMIC_SAN(store_64) 396#define atomic_store_rel_64 ATOMIC_SAN(store_rel_64) 397#define atomic_swap_64 ATOMIC_SAN(swap_64) 398#define atomic_testandclear_64 ATOMIC_SAN(testandclear_64) 399#define atomic_testandset_64 ATOMIC_SAN(testandset_64) 400 401#define atomic_thread_fence_acq ATOMIC_SAN(thread_fence_acq) 402#define atomic_thread_fence_acq_rel ATOMIC_SAN(thread_fence_acq_rel) 403#define atomic_thread_fence_rel ATOMIC_SAN(thread_fence_rel) 404#define atomic_thread_fence_seq_cst ATOMIC_SAN(thread_fence_seq_cst) 405#define atomic_interrupt_fence ATOMIC_SAN(interrupt_fence) 406 407#endif /* !SAN_RUNTIME */ 408 409#endif /* !_SYS_ATOMIC_SAN_H_ */ 410