Rev 1000 | Rev 1024 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 1000 | Rev 1001 | ||
|---|---|---|---|
| Line 29... | Line 29... | ||
| 29 | #ifndef __ppc32_ATOMIC_H__ |
29 | #ifndef __ppc32_ATOMIC_H__ |
| 30 | #define __ppc32_ATOMIC_H__ |
30 | #define __ppc32_ATOMIC_H__ |
| 31 | 31 | ||
| 32 | #include <arch/types.h> |
32 | #include <arch/types.h> |
| 33 | 33 | ||
| 34 | #define atomic_inc_pre(x) (atomic_inc(x) - 1) |
- | |
| 35 | #define atomic_dec_pre(x) (atomic_dec(x) + 1) |
- | |
| 36 | - | ||
| 37 | #define atomic_inc_post(x) atomic_inc(x) |
- | |
| 38 | #define atomic_dec_post(x) atomic_dec(x) |
- | |
| 39 | - | ||
| 40 | typedef struct { volatile __u32 count; } atomic_t; |
34 | typedef struct { volatile __u32 count; } atomic_t; |
| 41 | 35 | ||
| 42 | static inline void atomic_inc(atomic_t *val) { |
36 | static inline void atomic_inc(atomic_t *val) |
| - | 37 | { |
|
| 43 | __u32 tmp; |
38 | __u32 tmp; |
| 44 | 39 | ||
| 45 | asm __volatile__ ( |
40 | asm __volatile__ ( |
| 46 | "1:\n" |
41 | "1:\n" |
| 47 | "lwarx %0, 0, %2\n" |
42 | "lwarx %0, 0, %2\n" |
| Line 51... | Line 46... | ||
| 51 | : "=&r" (tmp), "=m" (val->count) |
46 | : "=&r" (tmp), "=m" (val->count) |
| 52 | : "r" (&val->count), "m" (val->count) |
47 | : "r" (&val->count), "m" (val->count) |
| 53 | : "cc"); |
48 | : "cc"); |
| 54 | } |
49 | } |
| 55 | 50 | ||
| 56 | static inline void atomic_dec(atomic_t *val) { |
51 | static inline void atomic_dec(atomic_t *val) |
| - | 52 | { |
|
| 57 | __u32 tmp; |
53 | __u32 tmp; |
| 58 | 54 | ||
| 59 | asm __volatile__( |
55 | asm __volatile__( |
| 60 | "1:\n" |
56 | "1:\n" |
| 61 | "lwarx %0, 0, %2\n" |
57 | "lwarx %0, 0, %2\n" |
| Line 65... | Line 61... | ||
| 65 | : "=&r" (tmp), "=m" (val->count) |
61 | : "=&r" (tmp), "=m" (val->count) |
| 66 | : "r" (&val->count), "m" (val->count) |
62 | : "r" (&val->count), "m" (val->count) |
| 67 | : "cc"); |
63 | : "cc"); |
| 68 | } |
64 | } |
| 69 | 65 | ||
| - | 66 | static inline __u32 atomic_inc_pre(atomic_t *val) |
|
| - | 67 | { |
|
| - | 68 | atomic_inc(val); |
|
| - | 69 | return val->count - 1; |
|
| - | 70 | } |
|
| - | 71 | ||
| - | 72 | static inline __u32 atomic_dec_pre(atomic_t *val) |
|
| - | 73 | { |
|
| - | 74 | atomic_dec(val); |
|
| - | 75 | return val->count + 1; |
|
| - | 76 | } |
|
| - | 77 | ||
| - | 78 | static inline __u32 atomic_inc_post(atomic_t *val) |
|
| - | 79 | { |
|
| - | 80 | atomic_inc(val); |
|
| - | 81 | return val->count; |
|
| - | 82 | } |
|
| - | 83 | ||
| - | 84 | static inline __u32 atomic_dec_post(atomic_t *val) |
|
| - | 85 | { |
|
| - | 86 | atomic_dec(val); |
|
| - | 87 | return val->count; |
|
| - | 88 | } |
|
| - | 89 | ||
| 70 | static inline void atomic_set(atomic_t *val, __u32 i) |
90 | static inline void atomic_set(atomic_t *val, __u32 i) |
| 71 | { |
91 | { |
| 72 | val->count = i; |
92 | val->count = i; |
| 73 | } |
93 | } |
| 74 | 94 | ||