12fb5be79SVladimir Kondratyev /*- 24d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 32fb5be79SVladimir Kondratyev * 42fb5be79SVladimir Kondratyev * Copyright (c) 2021 Vladimir Kondratyev <wulf@FreeBSD.org> 52fb5be79SVladimir Kondratyev * 62fb5be79SVladimir Kondratyev * Redistribution and use in source and binary forms, with or without 72fb5be79SVladimir Kondratyev * modification, are permitted provided that the following conditions 82fb5be79SVladimir Kondratyev * are met: 92fb5be79SVladimir Kondratyev * 1. Redistributions of source code must retain the above copyright 102fb5be79SVladimir Kondratyev * notice unmodified, this list of conditions, and the following 112fb5be79SVladimir Kondratyev * disclaimer. 122fb5be79SVladimir Kondratyev * 2. Redistributions in binary form must reproduce the above copyright 132fb5be79SVladimir Kondratyev * notice, this list of conditions and the following disclaimer in the 142fb5be79SVladimir Kondratyev * documentation and/or other materials provided with the distribution. 152fb5be79SVladimir Kondratyev * 162fb5be79SVladimir Kondratyev * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 172fb5be79SVladimir Kondratyev * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 182fb5be79SVladimir Kondratyev * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 192fb5be79SVladimir Kondratyev * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 202fb5be79SVladimir Kondratyev * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 212fb5be79SVladimir Kondratyev * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 222fb5be79SVladimir Kondratyev * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 232fb5be79SVladimir Kondratyev * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 242fb5be79SVladimir Kondratyev * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 252fb5be79SVladimir Kondratyev * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 262fb5be79SVladimir Kondratyev */ 272fb5be79SVladimir Kondratyev 28307f78f3SVladimir Kondratyev #ifndef _LINUXKPI_ASM_BARRIER_H_ 29307f78f3SVladimir Kondratyev #define _LINUXKPI_ASM_BARRIER_H_ 302fb5be79SVladimir Kondratyev 312fb5be79SVladimir Kondratyev #include <sys/types.h> 322fb5be79SVladimir Kondratyev #include <machine/atomic.h> 332fb5be79SVladimir Kondratyev 342fb5be79SVladimir Kondratyev #include <asm/atomic.h> 352fb5be79SVladimir Kondratyev #include <linux/compiler.h> 362fb5be79SVladimir Kondratyev 372fb5be79SVladimir Kondratyev /* TODO: Check other archs for atomic_thread_fence_* useability */ 382fb5be79SVladimir Kondratyev #if defined(__amd64__) || defined(__i386__) 392fb5be79SVladimir Kondratyev #define smp_mb() atomic_thread_fence_seq_cst() 402fb5be79SVladimir Kondratyev #define smp_wmb() atomic_thread_fence_rel() 412fb5be79SVladimir Kondratyev #define smp_rmb() atomic_thread_fence_acq() 422fb5be79SVladimir Kondratyev #define smp_store_mb(x, v) do { (void)xchg(&(x), v); } while (0) 432fb5be79SVladimir Kondratyev #endif 442fb5be79SVladimir Kondratyev 452fb5be79SVladimir Kondratyev #ifndef smp_mb 462fb5be79SVladimir Kondratyev #define smp_mb() mb() 472fb5be79SVladimir Kondratyev #endif 482fb5be79SVladimir Kondratyev #ifndef smp_wmb 492fb5be79SVladimir Kondratyev #define smp_wmb() wmb() 502fb5be79SVladimir Kondratyev #endif 512fb5be79SVladimir Kondratyev #ifndef smp_rmb 522fb5be79SVladimir Kondratyev #define smp_rmb() rmb() 532fb5be79SVladimir Kondratyev #endif 542fb5be79SVladimir Kondratyev #ifndef smp_store_mb 552fb5be79SVladimir Kondratyev #define smp_store_mb(x, v) do { WRITE_ONCE(x, v); smp_mb(); } while (0) 562fb5be79SVladimir Kondratyev #endif 572fb5be79SVladimir Kondratyev 58eca2f0f3SEmmanuel Vadot #define smp_mb__before_atomic() barrier() 59eca2f0f3SEmmanuel Vadot #define smp_mb__after_atomic() barrier() 60eca2f0f3SEmmanuel Vadot 61*597ffdc1SVladimir Kondratyev #define smp_store_release(p, v) do { smp_mb(); WRITE_ONCE(*p, v); } while (0) 62*597ffdc1SVladimir Kondratyev #define smp_load_acquire(p) ({ typeof(*p) _v = READ_ONCE(*p); smp_mb(); _v; }) 63*597ffdc1SVladimir Kondratyev 64307f78f3SVladimir Kondratyev #endif /* _LINUXKPI_ASM_BARRIER_H_ */ 65