Rev 625 | Rev 1024 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 625 | Rev 627 | ||
|---|---|---|---|
| Line 31... | Line 31... | ||
| 31 | 31 | ||
| 32 | #include <arch/types.h> |
32 | #include <arch/types.h> |
| 33 | 33 | ||
| 34 | typedef struct { volatile __u64 count; } atomic_t; |
34 | typedef struct { volatile __u64 count; } atomic_t; |
| 35 | 35 | ||
| - | 36 | /** Atomic addition. |
|
| - | 37 | * |
|
| - | 38 | * @param val Atomic value. |
|
| - | 39 | * @param imm Value to add. |
|
| - | 40 | * |
|
| - | 41 | * @return Value after addition. |
|
| - | 42 | */ |
|
| 36 | static inline atomic_t atomic_add(atomic_t *val, int imm) |
43 | static inline count_t atomic_add(atomic_t *val, int imm) |
| 37 | { |
44 | { |
| 38 | atomic_t v; |
45 | count_t v; |
| 39 | 46 | ||
| 40 | - | ||
| 41 | __asm__ volatile ("fetchadd8.rel %0 = %1, %2\n" : "=r" (v), "+m" (val->count) : "i" (imm)); |
47 | __asm__ volatile ("fetchadd8.rel %0 = %1, %2\n" : "=r" (v), "+m" (val->count) : "i" (imm)); |
| 42 | 48 | ||
| 43 | return v; |
49 | return v; |
| 44 | } |
50 | } |
| 45 | 51 | ||
| Line 54... | Line 60... | ||
| 54 | } |
60 | } |
| 55 | 61 | ||
| 56 | static inline void atomic_inc(atomic_t *val) { atomic_add(val, 1); } |
62 | static inline void atomic_inc(atomic_t *val) { atomic_add(val, 1); } |
| 57 | static inline void atomic_dec(atomic_t *val) { atomic_add(val, -1); } |
63 | static inline void atomic_dec(atomic_t *val) { atomic_add(val, -1); } |
| 58 | 64 | ||
| - | 65 | static inline count_t atomic_inc_pre(atomic_t *val) { return atomic_add(val, 1); } |
|
| - | 66 | static inline count_t atomic_dec_pre(atomic_t *val) { return atomic_add(val, -1); } |
|
| 59 | 67 | ||
| 60 | static inline atomic_t atomic_inc_pre(atomic_t *val) { return atomic_add(val, 1); } |
- | |
| 61 | static inline atomic_t atomic_dec_pre(atomic_t *val) { return atomic_add(val, -1); } |
- | |
| 62 | - | ||
| 63 | - | ||
| 64 | static inline atomic_t atomic_inc_post(atomic_t *val) { return atomic_add(val, 1) + 1; } |
68 | static inline count_t atomic_inc_post(atomic_t *val) { return atomic_add(val, 1) + 1; } |
| 65 | static inline atomic_t atomic_dec_post(atomic_t *val) { return atomic_add(val, -1) - 1; } |
69 | static inline count_t atomic_dec_post(atomic_t *val) { return atomic_add(val, -1) - 1; } |
| 66 | 70 | ||
| 67 | #endif |
71 | #endif |