Deleted Added
full compact
atomic.h (302408) atomic.h (315371)
1/*-
2 * Copyright (c) 1998 Doug Rabson
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 9 unchanged lines hidden (view full) ---

18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
1/*-
2 * Copyright (c) 1998 Doug Rabson
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 9 unchanged lines hidden (view full) ---

18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 * $FreeBSD: stable/11/sys/amd64/include/atomic.h 299912 2016-05-16 07:19:33Z sephe $
26 * $FreeBSD: stable/11/sys/amd64/include/atomic.h 315371 2017-03-16 06:00:27Z mjg $
27 */
28#ifndef _MACHINE_ATOMIC_H_
29#define _MACHINE_ATOMIC_H_
30
31#ifndef _SYS_CDEFS_H_
32#error this file needs sys/cdefs.h as a prerequisite
33#endif
34

--- 59 unchanged lines hidden (view full) ---

94 */
95#if defined(KLD_MODULE) || !defined(__GNUCLIKE_ASM)
96#define ATOMIC_ASM(NAME, TYPE, OP, CONS, V) \
97void atomic_##NAME##_##TYPE(volatile u_##TYPE *p, u_##TYPE v); \
98void atomic_##NAME##_barr_##TYPE(volatile u_##TYPE *p, u_##TYPE v)
99
100int atomic_cmpset_int(volatile u_int *dst, u_int expect, u_int src);
101int atomic_cmpset_long(volatile u_long *dst, u_long expect, u_long src);
27 */
28#ifndef _MACHINE_ATOMIC_H_
29#define _MACHINE_ATOMIC_H_
30
31#ifndef _SYS_CDEFS_H_
32#error this file needs sys/cdefs.h as a prerequisite
33#endif
34

--- 59 unchanged lines hidden (view full) ---

94 */
95#if defined(KLD_MODULE) || !defined(__GNUCLIKE_ASM)
96#define ATOMIC_ASM(NAME, TYPE, OP, CONS, V) \
97void atomic_##NAME##_##TYPE(volatile u_##TYPE *p, u_##TYPE v); \
98void atomic_##NAME##_barr_##TYPE(volatile u_##TYPE *p, u_##TYPE v)
99
100int atomic_cmpset_int(volatile u_int *dst, u_int expect, u_int src);
101int atomic_cmpset_long(volatile u_long *dst, u_long expect, u_long src);
102int atomic_fcmpset_int(volatile u_int *dst, u_int *expect, u_int src);
103int atomic_fcmpset_long(volatile u_long *dst, u_long *expect, u_long src);
102u_int atomic_fetchadd_int(volatile u_int *p, u_int v);
103u_long atomic_fetchadd_long(volatile u_long *p, u_long v);
104int atomic_testandset_int(volatile u_int *p, u_int v);
105int atomic_testandset_long(volatile u_long *p, u_int v);
106int atomic_testandclear_int(volatile u_int *p, u_int v);
107int atomic_testandclear_long(volatile u_long *p, u_int v);
108void atomic_thread_fence_acq(void);
109void atomic_thread_fence_acq_rel(void);

--- 81 unchanged lines hidden (view full) ---

191 : "=q" (res), /* 0 */
192 "+m" (*dst), /* 1 */
193 "+a" (expect) /* 2 */
194 : "r" (src) /* 3 */
195 : "memory", "cc");
196 return (res);
197}
198
104u_int atomic_fetchadd_int(volatile u_int *p, u_int v);
105u_long atomic_fetchadd_long(volatile u_long *p, u_long v);
106int atomic_testandset_int(volatile u_int *p, u_int v);
107int atomic_testandset_long(volatile u_long *p, u_int v);
108int atomic_testandclear_int(volatile u_int *p, u_int v);
109int atomic_testandclear_long(volatile u_long *p, u_int v);
110void atomic_thread_fence_acq(void);
111void atomic_thread_fence_acq_rel(void);

--- 81 unchanged lines hidden (view full) ---

193 : "=q" (res), /* 0 */
194 "+m" (*dst), /* 1 */
195 "+a" (expect) /* 2 */
196 : "r" (src) /* 3 */
197 : "memory", "cc");
198 return (res);
199}
200
201static __inline int
202atomic_fcmpset_int(volatile u_int *dst, u_int *expect, u_int src)
203{
204 u_char res;
205
206 __asm __volatile(
207 " " MPLOCKED " "
208 " cmpxchgl %3,%1 ; "
209 " sete %0 ; "
210 "# atomic_fcmpset_int"
211 : "=r" (res), /* 0 */
212 "+m" (*dst), /* 1 */
213 "+a" (*expect) /* 2 */
214 : "r" (src) /* 3 */
215 : "memory", "cc");
216 return (res);
217}
218
219static __inline int
220atomic_fcmpset_long(volatile u_long *dst, u_long *expect, u_long src)
221{
222 u_char res;
223
224 __asm __volatile(
225 " " MPLOCKED " "
226 " cmpxchgq %3,%1 ; "
227 " sete %0 ; "
228 "# atomic_fcmpset_long"
229 : "=r" (res), /* 0 */
230 "+m" (*dst), /* 1 */
231 "+a" (*expect) /* 2 */
232 : "r" (src) /* 3 */
233 : "memory", "cc");
234 return (res);
235}
236
199/*
200 * Atomically add the value of v to the integer pointed to by p and return
201 * the previous value of *p.
202 */
203static __inline u_int
204atomic_fetchadd_int(volatile u_int *p, u_int v)
205{
206

--- 292 unchanged lines hidden (view full) ---

499#define atomic_clear_acq_int atomic_clear_barr_int
500#define atomic_clear_rel_int atomic_clear_barr_int
501#define atomic_add_acq_int atomic_add_barr_int
502#define atomic_add_rel_int atomic_add_barr_int
503#define atomic_subtract_acq_int atomic_subtract_barr_int
504#define atomic_subtract_rel_int atomic_subtract_barr_int
505#define atomic_cmpset_acq_int atomic_cmpset_int
506#define atomic_cmpset_rel_int atomic_cmpset_int
237/*
238 * Atomically add the value of v to the integer pointed to by p and return
239 * the previous value of *p.
240 */
241static __inline u_int
242atomic_fetchadd_int(volatile u_int *p, u_int v)
243{
244

--- 292 unchanged lines hidden (view full) ---

537#define atomic_clear_acq_int atomic_clear_barr_int
538#define atomic_clear_rel_int atomic_clear_barr_int
539#define atomic_add_acq_int atomic_add_barr_int
540#define atomic_add_rel_int atomic_add_barr_int
541#define atomic_subtract_acq_int atomic_subtract_barr_int
542#define atomic_subtract_rel_int atomic_subtract_barr_int
543#define atomic_cmpset_acq_int atomic_cmpset_int
544#define atomic_cmpset_rel_int atomic_cmpset_int
545#define atomic_fcmpset_acq_int atomic_fcmpset_int
546#define atomic_fcmpset_rel_int atomic_fcmpset_int
507
508#define atomic_set_acq_long atomic_set_barr_long
509#define atomic_set_rel_long atomic_set_barr_long
510#define atomic_clear_acq_long atomic_clear_barr_long
511#define atomic_clear_rel_long atomic_clear_barr_long
512#define atomic_add_acq_long atomic_add_barr_long
513#define atomic_add_rel_long atomic_add_barr_long
514#define atomic_subtract_acq_long atomic_subtract_barr_long
515#define atomic_subtract_rel_long atomic_subtract_barr_long
516#define atomic_cmpset_acq_long atomic_cmpset_long
517#define atomic_cmpset_rel_long atomic_cmpset_long
547
548#define atomic_set_acq_long atomic_set_barr_long
549#define atomic_set_rel_long atomic_set_barr_long
550#define atomic_clear_acq_long atomic_clear_barr_long
551#define atomic_clear_rel_long atomic_clear_barr_long
552#define atomic_add_acq_long atomic_add_barr_long
553#define atomic_add_rel_long atomic_add_barr_long
554#define atomic_subtract_acq_long atomic_subtract_barr_long
555#define atomic_subtract_rel_long atomic_subtract_barr_long
556#define atomic_cmpset_acq_long atomic_cmpset_long
557#define atomic_cmpset_rel_long atomic_cmpset_long
558#define atomic_fcmpset_acq_long atomic_fcmpset_long
559#define atomic_fcmpset_rel_long atomic_fcmpset_long
518
519#define atomic_readandclear_int(p) atomic_swap_int(p, 0)
520#define atomic_readandclear_long(p) atomic_swap_long(p, 0)
521
522/* Operations on 8-bit bytes. */
523#define atomic_set_8 atomic_set_char
524#define atomic_set_acq_8 atomic_set_acq_char
525#define atomic_set_rel_8 atomic_set_rel_char

--- 38 unchanged lines hidden (view full) ---

564#define atomic_subtract_32 atomic_subtract_int
565#define atomic_subtract_acq_32 atomic_subtract_acq_int
566#define atomic_subtract_rel_32 atomic_subtract_rel_int
567#define atomic_load_acq_32 atomic_load_acq_int
568#define atomic_store_rel_32 atomic_store_rel_int
569#define atomic_cmpset_32 atomic_cmpset_int
570#define atomic_cmpset_acq_32 atomic_cmpset_acq_int
571#define atomic_cmpset_rel_32 atomic_cmpset_rel_int
560
561#define atomic_readandclear_int(p) atomic_swap_int(p, 0)
562#define atomic_readandclear_long(p) atomic_swap_long(p, 0)
563
564/* Operations on 8-bit bytes. */
565#define atomic_set_8 atomic_set_char
566#define atomic_set_acq_8 atomic_set_acq_char
567#define atomic_set_rel_8 atomic_set_rel_char

--- 38 unchanged lines hidden (view full) ---

606#define atomic_subtract_32 atomic_subtract_int
607#define atomic_subtract_acq_32 atomic_subtract_acq_int
608#define atomic_subtract_rel_32 atomic_subtract_rel_int
609#define atomic_load_acq_32 atomic_load_acq_int
610#define atomic_store_rel_32 atomic_store_rel_int
611#define atomic_cmpset_32 atomic_cmpset_int
612#define atomic_cmpset_acq_32 atomic_cmpset_acq_int
613#define atomic_cmpset_rel_32 atomic_cmpset_rel_int
614#define atomic_fcmpset_32 atomic_fcmpset_int
615#define atomic_fcmpset_acq_32 atomic_fcmpset_acq_int
616#define atomic_fcmpset_rel_32 atomic_fcmpset_rel_int
572#define atomic_swap_32 atomic_swap_int
573#define atomic_readandclear_32 atomic_readandclear_int
574#define atomic_fetchadd_32 atomic_fetchadd_int
575#define atomic_testandset_32 atomic_testandset_int
576#define atomic_testandclear_32 atomic_testandclear_int
577
578/* Operations on 64-bit quad words. */
579#define atomic_set_64 atomic_set_long

--- 8 unchanged lines hidden (view full) ---

588#define atomic_subtract_64 atomic_subtract_long
589#define atomic_subtract_acq_64 atomic_subtract_acq_long
590#define atomic_subtract_rel_64 atomic_subtract_rel_long
591#define atomic_load_acq_64 atomic_load_acq_long
592#define atomic_store_rel_64 atomic_store_rel_long
593#define atomic_cmpset_64 atomic_cmpset_long
594#define atomic_cmpset_acq_64 atomic_cmpset_acq_long
595#define atomic_cmpset_rel_64 atomic_cmpset_rel_long
617#define atomic_swap_32 atomic_swap_int
618#define atomic_readandclear_32 atomic_readandclear_int
619#define atomic_fetchadd_32 atomic_fetchadd_int
620#define atomic_testandset_32 atomic_testandset_int
621#define atomic_testandclear_32 atomic_testandclear_int
622
623/* Operations on 64-bit quad words. */
624#define atomic_set_64 atomic_set_long

--- 8 unchanged lines hidden (view full) ---

633#define atomic_subtract_64 atomic_subtract_long
634#define atomic_subtract_acq_64 atomic_subtract_acq_long
635#define atomic_subtract_rel_64 atomic_subtract_rel_long
636#define atomic_load_acq_64 atomic_load_acq_long
637#define atomic_store_rel_64 atomic_store_rel_long
638#define atomic_cmpset_64 atomic_cmpset_long
639#define atomic_cmpset_acq_64 atomic_cmpset_acq_long
640#define atomic_cmpset_rel_64 atomic_cmpset_rel_long
641#define atomic_fcmpset_64 atomic_fcmpset_long
642#define atomic_fcmpset_acq_64 atomic_fcmpset_acq_long
643#define atomic_fcmpset_rel_64 atomic_fcmpset_rel_long
596#define atomic_swap_64 atomic_swap_long
597#define atomic_readandclear_64 atomic_readandclear_long
598#define atomic_fetchadd_64 atomic_fetchadd_long
599#define atomic_testandset_64 atomic_testandset_long
600#define atomic_testandclear_64 atomic_testandclear_long
601
602/* Operations on pointers. */
603#define atomic_set_ptr atomic_set_long

--- 8 unchanged lines hidden (view full) ---

612#define atomic_subtract_ptr atomic_subtract_long
613#define atomic_subtract_acq_ptr atomic_subtract_acq_long
614#define atomic_subtract_rel_ptr atomic_subtract_rel_long
615#define atomic_load_acq_ptr atomic_load_acq_long
616#define atomic_store_rel_ptr atomic_store_rel_long
617#define atomic_cmpset_ptr atomic_cmpset_long
618#define atomic_cmpset_acq_ptr atomic_cmpset_acq_long
619#define atomic_cmpset_rel_ptr atomic_cmpset_rel_long
644#define atomic_swap_64 atomic_swap_long
645#define atomic_readandclear_64 atomic_readandclear_long
646#define atomic_fetchadd_64 atomic_fetchadd_long
647#define atomic_testandset_64 atomic_testandset_long
648#define atomic_testandclear_64 atomic_testandclear_long
649
650/* Operations on pointers. */
651#define atomic_set_ptr atomic_set_long

--- 8 unchanged lines hidden (view full) ---

660#define atomic_subtract_ptr atomic_subtract_long
661#define atomic_subtract_acq_ptr atomic_subtract_acq_long
662#define atomic_subtract_rel_ptr atomic_subtract_rel_long
663#define atomic_load_acq_ptr atomic_load_acq_long
664#define atomic_store_rel_ptr atomic_store_rel_long
665#define atomic_cmpset_ptr atomic_cmpset_long
666#define atomic_cmpset_acq_ptr atomic_cmpset_acq_long
667#define atomic_cmpset_rel_ptr atomic_cmpset_rel_long
668#define atomic_fcmpset_ptr atomic_fcmpset_long
669#define atomic_fcmpset_acq_ptr atomic_fcmpset_acq_long
670#define atomic_fcmpset_rel_ptr atomic_fcmpset_rel_long
620#define atomic_swap_ptr atomic_swap_long
621#define atomic_readandclear_ptr atomic_readandclear_long
622
623#endif /* !WANT_FUNCTIONS */
624
625#endif /* !_MACHINE_ATOMIC_H_ */
671#define atomic_swap_ptr atomic_swap_long
672#define atomic_readandclear_ptr atomic_readandclear_long
673
674#endif /* !WANT_FUNCTIONS */
675
676#endif /* !_MACHINE_ATOMIC_H_ */