diff options
| author | Konstantin Belousov <kib@FreeBSD.org> | 2017-12-19 09:59:20 +0000 |
|---|---|---|
| committer | Konstantin Belousov <kib@FreeBSD.org> | 2017-12-19 09:59:20 +0000 |
| commit | 30d4f9e8883099cbdbcb732b68372b7c2e0ec979 (patch) | |
| tree | bbf465c0e52b2f1d57ce7db75cf10890dc39d5cd /sys | |
| parent | 5cf3cd108f77fec0c2505b00fb58efae71c4fc42 (diff) | |
Notes
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/amd64/include/atomic.h | 2 | ||||
| -rw-r--r-- | sys/arm/include/atomic.h | 2 | ||||
| -rw-r--r-- | sys/arm64/include/atomic.h | 2 | ||||
| -rw-r--r-- | sys/i386/include/atomic.h | 2 | ||||
| -rw-r--r-- | sys/mips/include/atomic.h | 2 | ||||
| -rw-r--r-- | sys/powerpc/include/atomic.h | 2 | ||||
| -rw-r--r-- | sys/riscv/include/atomic.h | 2 | ||||
| -rw-r--r-- | sys/sparc64/include/atomic.h | 2 | ||||
| -rw-r--r-- | sys/sys/atomic_common.h | 73 |
9 files changed, 89 insertions, 0 deletions
diff --git a/sys/amd64/include/atomic.h b/sys/amd64/include/atomic.h index 84c0271807355..3847b09cff47c 100644 --- a/sys/amd64/include/atomic.h +++ b/sys/amd64/include/atomic.h @@ -57,6 +57,8 @@ #define wmb() __asm __volatile("sfence;" : : : "memory") #define rmb() __asm __volatile("lfence;" : : : "memory") +#include <sys/atomic_common.h> + /* * Various simple operations on memory, each of which is atomic in the * presence of interrupts and multiple processors. diff --git a/sys/arm/include/atomic.h b/sys/arm/include/atomic.h index 552732966057d..3c7b145813a4a 100644 --- a/sys/arm/include/atomic.h +++ b/sys/arm/include/atomic.h @@ -41,6 +41,8 @@ #ifndef _MACHINE_ATOMIC_H_ #define _MACHINE_ATOMIC_H_ +#include <sys/atomic_common.h> + #include <machine/armreg.h> #ifndef _KERNEL diff --git a/sys/arm64/include/atomic.h b/sys/arm64/include/atomic.h index 08bb10364144d..a870f40a23c79 100644 --- a/sys/arm64/include/atomic.h +++ b/sys/arm64/include/atomic.h @@ -29,6 +29,8 @@ #ifndef _MACHINE_ATOMIC_H_ #define _MACHINE_ATOMIC_H_ +#include <sys/atomic_common.h> + #define isb() __asm __volatile("isb" : : : "memory") /* diff --git a/sys/i386/include/atomic.h b/sys/i386/include/atomic.h index dc697f7cecd52..270b5eaa96390 100644 --- a/sys/i386/include/atomic.h +++ b/sys/i386/include/atomic.h @@ -34,6 +34,8 @@ #error this file needs sys/cdefs.h as a prerequisite #endif +#include <sys/atomic_common.h> + #ifdef _KERNEL #include <machine/md_var.h> #include <machine/specialreg.h> diff --git a/sys/mips/include/atomic.h b/sys/mips/include/atomic.h index 22050dad88ac4..668d311d24afc 100644 --- a/sys/mips/include/atomic.h +++ b/sys/mips/include/atomic.h @@ -36,6 +36,8 @@ #error this file needs sys/cdefs.h as a prerequisite #endif +#include <sys/atomic_common.h> + /* * Note: All the 64-bit atomic operations are only atomic when running * in 64-bit mode. It is assumed that code compiled for n32 and n64 diff --git a/sys/powerpc/include/atomic.h b/sys/powerpc/include/atomic.h index acd78579a6347..1b3c084db1965 100644 --- a/sys/powerpc/include/atomic.h +++ b/sys/powerpc/include/atomic.h @@ -38,6 +38,8 @@ #error this file needs sys/cdefs.h as a prerequisite #endif +#include <sys/atomic_common.h> + /* * The __ATOMIC_REL/ACQ() macros provide memory barriers only in conjunction * with the atomic lXarx/stXcx. sequences below. They are not exposed outside diff --git a/sys/riscv/include/atomic.h b/sys/riscv/include/atomic.h index f82d0dd4fee6d..ec61691f09d5f 100644 --- a/sys/riscv/include/atomic.h +++ b/sys/riscv/include/atomic.h @@ -37,6 +37,8 @@ #ifndef _MACHINE_ATOMIC_H_ #define _MACHINE_ATOMIC_H_ +#include <sys/atomic_common.h> + #define fence() __asm __volatile("fence" ::: "memory"); #define mb() fence() #define rmb() fence() diff --git a/sys/sparc64/include/atomic.h b/sys/sparc64/include/atomic.h index be49909630309..e34853b5399f6 100644 --- a/sys/sparc64/include/atomic.h +++ b/sys/sparc64/include/atomic.h @@ -39,6 +39,8 @@ #define wmb() mb() #define rmb() mb() +#include <sys/atomic_common.h> + /* Userland needs different ASI's. */ #ifdef _KERNEL #define __ASI_ATOMIC ASI_N diff --git a/sys/sys/atomic_common.h b/sys/sys/atomic_common.h new file mode 100644 index 0000000000000..9aa30fa24a279 --- /dev/null +++ b/sys/sys/atomic_common.h @@ -0,0 +1,73 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * + * Copyright (c) 2017 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Konstantin Belousov <kib@FreeBSD.org> + * under sponsorship from the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ +#ifndef _SYS_ATOMIC_COMMON_H_ +#define _SYS_ATOMIC_COMMON_H_ + +#ifndef _MACHINE_ATOMIC_H_ +#error do not include this header, use machine/atomic.h +#endif + +#define atomic_load_char(p) (*(volatile u_char *)(p)) +#define atomic_load_short(p) (*(volatile u_short *)(p)) +#define atomic_load_int(p) (*(volatile u_int *)(p)) +#define atomic_load_long(p) (*(volatile u_long *)(p)) +#define atomic_load_ptr(p) (*(volatile uintptr_t*)(p)) +#define atomic_load_8(p) (*(volatile uint8_t *)(p)) +#define atomic_load_16(p) (*(volatile uint16_t *)(p)) +#define atomic_load_32(p) (*(volatile uint32_t *)(p)) +#ifdef _LP64 +#define atomic_load_64(p) (*(volatile uint64_t *)(p)) +#endif + +#define atomic_store_char(p, v) \ + (*(volatile u_char *)(p) = (u_char)(v)) +#define atomic_store_short(p, v) \ + (*(volatile u_short *)(p) = (u_short)(v)) +#define atomic_store_int(p, v) \ + (*(volatile u_int *)(p) = (u_int)(v)) +#define atomic_store_long(p, v) \ + (*(volatile u_long *)(p) = (u_long)(v)) +#define atomic_store_ptr(p, v) \ + (*(uintptr_t *)(p) = (uintptr_t)(v)) +#define atomic_store_8(p, v) \ + (*(volatile uint8_t *)(p) = (uint8_t)(v)) +#define atomic_store_16(p, v) \ + (*(volatile uint16_t *)(p) = (uint16_t)(v)) +#define atomic_store_32(p, v) \ + (*(volatile uint32_t *)(p) = (uint32_t)(v)) +#ifdef _LP64 +#define atomic_store_64(p, v) \ + (*(volatile uint64_t *)(p) = (uint64_t)(v)) +#endif + +#endif |
