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 |