xref: /freebsd-src/sys/compat/linuxkpi/common/include/asm/barrier.h (revision 597ffdc1d3503110165dd57685c29da64386a7db)
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