atomic.h (141106) | atomic.h (143063) |
---|---|
1/*- 2 * Copyright (c) 2001 Benno Rice 3 * Copyright (c) 2001 David E. O'Brien 4 * Copyright (c) 1998 Doug Rabson 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions --- 11 unchanged lines hidden (view full) --- 20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 * | 1/*- 2 * Copyright (c) 2001 Benno Rice 3 * Copyright (c) 2001 David E. O'Brien 4 * Copyright (c) 1998 Doug Rabson 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions --- 11 unchanged lines hidden (view full) --- 20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 * |
28 * $FreeBSD: head/sys/powerpc/include/atomic.h 141106 2005-02-01 11:17:24Z grehan $ | 28 * $FreeBSD: head/sys/powerpc/include/atomic.h 143063 2005-03-02 21:33:29Z joerg $ |
29 */ 30 31#ifndef _MACHINE_ATOMIC_H_ 32#define _MACHINE_ATOMIC_H_ 33 34#include <machine/cpufunc.h> 35 | 29 */ 30 31#ifndef _MACHINE_ATOMIC_H_ 32#define _MACHINE_ATOMIC_H_ 33 34#include <machine/cpufunc.h> 35 |
36#ifndef _SYS_CDEFS_H_ 37#error this file needs sys/cdefs.h as a prerequisite 38#endif 39 |
|
36/* 37 * Various simple arithmetic on memory which is atomic in the presence 38 * of interrupts and SMP safe. 39 */ 40 41void atomic_set_8(volatile uint8_t *, uint8_t); 42void atomic_clear_8(volatile uint8_t *, uint8_t); 43void atomic_add_8(volatile uint8_t *, uint8_t); --- 4 unchanged lines hidden (view full) --- 48void atomic_add_16(volatile uint16_t *, uint16_t); 49void atomic_subtract_16(volatile uint16_t *, uint16_t); 50 51static __inline void 52atomic_set_32(volatile uint32_t *p, uint32_t v) 53{ 54 uint32_t temp; 55 | 40/* 41 * Various simple arithmetic on memory which is atomic in the presence 42 * of interrupts and SMP safe. 43 */ 44 45void atomic_set_8(volatile uint8_t *, uint8_t); 46void atomic_clear_8(volatile uint8_t *, uint8_t); 47void atomic_add_8(volatile uint8_t *, uint8_t); --- 4 unchanged lines hidden (view full) --- 52void atomic_add_16(volatile uint16_t *, uint16_t); 53void atomic_subtract_16(volatile uint16_t *, uint16_t); 54 55static __inline void 56atomic_set_32(volatile uint32_t *p, uint32_t v) 57{ 58 uint32_t temp; 59 |
56#ifdef __GNUC__ | 60#ifdef __GNUCLIKE_ASM |
57 __asm __volatile ( 58 "1:\tlwarx %0, 0, %2\n\t" /* load old value */ 59 "or %0, %3, %0\n\t" /* calculate new value */ 60 "stwcx. %0, 0, %2\n\t" /* attempt to store */ 61 "bne- 1b\n\t" /* spin if failed */ 62 : "=&r" (temp), "+m" (*p) 63 : "r" (p), "r" (v) 64 : "cc", "memory"); 65#endif 66} 67 68static __inline void 69atomic_clear_32(volatile uint32_t *p, uint32_t v) 70{ 71 uint32_t temp; 72 | 61 __asm __volatile ( 62 "1:\tlwarx %0, 0, %2\n\t" /* load old value */ 63 "or %0, %3, %0\n\t" /* calculate new value */ 64 "stwcx. %0, 0, %2\n\t" /* attempt to store */ 65 "bne- 1b\n\t" /* spin if failed */ 66 : "=&r" (temp), "+m" (*p) 67 : "r" (p), "r" (v) 68 : "cc", "memory"); 69#endif 70} 71 72static __inline void 73atomic_clear_32(volatile uint32_t *p, uint32_t v) 74{ 75 uint32_t temp; 76 |
73#ifdef __GNUC__ | 77#ifdef __GNUCLIKE_ASM |
74 __asm __volatile ( 75 "1:\tlwarx %0, 0, %2\n\t" /* load old value */ 76 "andc %0, %0, %3\n\t" /* calculate new value */ 77 "stwcx. %0, 0, %2\n\t" /* attempt to store */ 78 "bne- 1b\n\t" /* spin if failed */ 79 : "=&r" (temp), "+m" (*p) 80 : "r" (p), "r" (v) 81 : "cc", "memory"); 82#endif 83} 84 85static __inline void 86atomic_add_32(volatile uint32_t *p, uint32_t v) 87{ 88 uint32_t temp; 89 | 78 __asm __volatile ( 79 "1:\tlwarx %0, 0, %2\n\t" /* load old value */ 80 "andc %0, %0, %3\n\t" /* calculate new value */ 81 "stwcx. %0, 0, %2\n\t" /* attempt to store */ 82 "bne- 1b\n\t" /* spin if failed */ 83 : "=&r" (temp), "+m" (*p) 84 : "r" (p), "r" (v) 85 : "cc", "memory"); 86#endif 87} 88 89static __inline void 90atomic_add_32(volatile uint32_t *p, uint32_t v) 91{ 92 uint32_t temp; 93 |
90#ifdef __GNUC__ | 94#ifdef __GNUCLIKE_ASM |
91 __asm __volatile ( 92 "1:\tlwarx %0, 0, %2\n\t" /* load old value */ 93 "add %0, %3, %0\n\t" /* calculate new value */ 94 "stwcx. %0, 0, %2\n\t" /* attempt to store */ 95 "bne- 1b\n\t" /* spin if failed */ 96 : "=&r" (temp), "+m" (*p) 97 : "r" (p), "r" (v) 98 : "cc", "memory"); 99#endif 100} 101 102static __inline void 103atomic_subtract_32(volatile uint32_t *p, uint32_t v) 104{ 105 uint32_t temp; 106 | 95 __asm __volatile ( 96 "1:\tlwarx %0, 0, %2\n\t" /* load old value */ 97 "add %0, %3, %0\n\t" /* calculate new value */ 98 "stwcx. %0, 0, %2\n\t" /* attempt to store */ 99 "bne- 1b\n\t" /* spin if failed */ 100 : "=&r" (temp), "+m" (*p) 101 : "r" (p), "r" (v) 102 : "cc", "memory"); 103#endif 104} 105 106static __inline void 107atomic_subtract_32(volatile uint32_t *p, uint32_t v) 108{ 109 uint32_t temp; 110 |
107#ifdef __GNUC__ | 111#ifdef __GNUCLIKE_ASM |
108 __asm __volatile ( 109 "1:\tlwarx %0, 0, %2\n\t" /* load old value */ 110 "subf %0, %3, %0\n\t" /* calculate new value */ 111 "stwcx. %0, 0, %2\n\t" /* attempt to store */ 112 "bne- 1b\n\t" /* spin if failed */ 113 : "=&r" (temp), "+m" (*p) 114 : "r" (p), "r" (v) 115 : "cc", "memory"); 116#endif 117} 118 119static __inline uint32_t 120atomic_readandclear_32(volatile uint32_t *addr) 121{ 122 uint32_t result,temp; 123 | 112 __asm __volatile ( 113 "1:\tlwarx %0, 0, %2\n\t" /* load old value */ 114 "subf %0, %3, %0\n\t" /* calculate new value */ 115 "stwcx. %0, 0, %2\n\t" /* attempt to store */ 116 "bne- 1b\n\t" /* spin if failed */ 117 : "=&r" (temp), "+m" (*p) 118 : "r" (p), "r" (v) 119 : "cc", "memory"); 120#endif 121} 122 123static __inline uint32_t 124atomic_readandclear_32(volatile uint32_t *addr) 125{ 126 uint32_t result,temp; 127 |
124#ifdef __GNUC__ | 128#ifdef __GNUCLIKE_ASM |
125 __asm __volatile ( 126 "\tsync\n" /* drain writes */ 127 "1:\tlwarx %0, 0, %3\n\t" /* load old value */ 128 "li %1, 0\n\t" /* load new value */ 129 "stwcx. %1, 0, %3\n\t" /* attempt to store */ 130 "bne- 1b\n\t" /* spin if failed */ 131 : "=&r"(result), "=&r"(temp), "+m" (*addr) 132 : "r" (addr) --- 210 unchanged lines hidden (view full) --- 343 * two values are equal, update the value of *p with newval. Returns 344 * zero if the compare failed, nonzero otherwise. 345 */ 346static __inline uint32_t 347atomic_cmpset_32(volatile uint32_t* p, uint32_t cmpval, uint32_t newval) 348{ 349 uint32_t ret; 350 | 129 __asm __volatile ( 130 "\tsync\n" /* drain writes */ 131 "1:\tlwarx %0, 0, %3\n\t" /* load old value */ 132 "li %1, 0\n\t" /* load new value */ 133 "stwcx. %1, 0, %3\n\t" /* attempt to store */ 134 "bne- 1b\n\t" /* spin if failed */ 135 : "=&r"(result), "=&r"(temp), "+m" (*addr) 136 : "r" (addr) --- 210 unchanged lines hidden (view full) --- 347 * two values are equal, update the value of *p with newval. Returns 348 * zero if the compare failed, nonzero otherwise. 349 */ 350static __inline uint32_t 351atomic_cmpset_32(volatile uint32_t* p, uint32_t cmpval, uint32_t newval) 352{ 353 uint32_t ret; 354 |
351#ifdef __GNUC__ | 355#ifdef __GNUCLIKE_ASM |
352 __asm __volatile ( 353 "1:\tlwarx %0, 0, %2\n\t" /* load old value */ 354 "cmplw %3, %0\n\t" /* compare */ 355 "bne 2f\n\t" /* exit if not equal */ 356 "stwcx. %4, 0, %2\n\t" /* attempt to store */ 357 "bne- 1b\n\t" /* spin if failed */ 358 "li %0, 1\n\t" /* success - retval = 1 */ 359 "b 3f\n\t" /* we've succeeded */ --- 127 unchanged lines hidden --- | 356 __asm __volatile ( 357 "1:\tlwarx %0, 0, %2\n\t" /* load old value */ 358 "cmplw %3, %0\n\t" /* compare */ 359 "bne 2f\n\t" /* exit if not equal */ 360 "stwcx. %4, 0, %2\n\t" /* attempt to store */ 361 "bne- 1b\n\t" /* spin if failed */ 362 "li %0, 1\n\t" /* success - retval = 1 */ 363 "b 3f\n\t" /* we've succeeded */ --- 127 unchanged lines hidden --- |