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_ */ |