Rev 534 | Rev 627 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 534 | Rev 625 | ||
|---|---|---|---|
| Line 39... | Line 39... | ||
| 39 | 39 | ||
| 40 | #define atomic_inc_post(x) atomic_add(x, 1) |
40 | #define atomic_inc_post(x) atomic_add(x, 1) |
| 41 | #define atomic_dec_post(x) atomic_add(x, -1) |
41 | #define atomic_dec_post(x) atomic_add(x, -1) |
| 42 | 42 | ||
| 43 | 43 | ||
| 44 | typedef volatile __u32 atomic_t; |
44 | typedef struct { volatile __u32 count; } atomic_t; |
| 45 | 45 | ||
| 46 | /* Atomic addition of immediate value. |
46 | /* Atomic addition of immediate value. |
| 47 | * |
47 | * |
| 48 | * @param val Memory location to which will be the immediate value added. |
48 | * @param val Memory location to which will be the immediate value added. |
| 49 | * @param i Signed immediate that will be added to *val. |
49 | * @param i Signed immediate that will be added to *val. |
| Line 60... | Line 60... | ||
| 60 | " addiu %0, %0, %3\n" /* same as addi, but never traps on overflow */ |
60 | " addiu %0, %0, %3\n" /* same as addi, but never traps on overflow */ |
| 61 | " move %2, %0\n" |
61 | " move %2, %0\n" |
| 62 | " sc %0, %1\n" |
62 | " sc %0, %1\n" |
| 63 | " beq %0, %4, 1b\n" /* if the atomic operation failed, try again */ |
63 | " beq %0, %4, 1b\n" /* if the atomic operation failed, try again */ |
| 64 | /* nop */ /* nop is inserted automatically by compiler */ |
64 | /* nop */ /* nop is inserted automatically by compiler */ |
| 65 | : "=r" (tmp), "=m" (*val), "=r" (v) |
65 | : "=r" (tmp), "=m" (val->count), "=r" (v) |
| 66 | : "i" (i), "i" (0) |
66 | : "i" (i), "i" (0) |
| 67 | ); |
67 | ); |
| 68 | 68 | ||
| 69 | return v; |
69 | return v; |
| 70 | } |
70 | } |
| 71 | 71 | ||
| - | 72 | /* Reads/writes are atomic on mips for 4-bytes */ |
|
| - | 73 | ||
| - | 74 | static inline void atomic_set(atomic_t *val, __u32 i) |
|
| - | 75 | { |
|
| - | 76 | val->count = i; |
|
| - | 77 | } |
|
| - | 78 | ||
| - | 79 | static inline __u32 atomic_get(atomic_t *val) |
|
| - | 80 | { |
|
| - | 81 | return val->count; |
|
| - | 82 | } |
|
| 72 | 83 | ||
| 73 | #endif |
84 | #endif |