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 |