Deleted Added
full compact
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 ---