Rev 111 | Rev 116 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 111 | Rev 115 | ||
---|---|---|---|
Line 29... | Line 29... | ||
29 | #ifndef __ia32_ATOMIC_H__ |
29 | #ifndef __ia32_ATOMIC_H__ |
30 | #define __ia32_ATOMIC_H__ |
30 | #define __ia32_ATOMIC_H__ |
31 | 31 | ||
32 | #include <arch/types.h> |
32 | #include <arch/types.h> |
33 | 33 | ||
34 | extern void atomic_inc(volatile int *val); |
34 | static inline void atomic_inc(volatile int *val) { |
- | 35 | #ifdef __SMP__ |
|
- | 36 | __asm__ volatile ("lock incl (%0)\n" : : "r" (val)); |
|
- | 37 | #else |
|
- | 38 | __asm__ volatile ("incl (%0)\n" : : "r" (val)); |
|
- | 39 | #endif /* __SMP__ */ |
|
- | 40 | } |
|
- | 41 | ||
35 | extern void atomic_dec(volatile int *val); |
42 | static inline void atomic_dec(volatile int *val) { |
- | 43 | #ifdef __SMP__ |
|
- | 44 | __asm__ volatile ("lock decl (%0)\n" : : "r" (val)); |
|
- | 45 | #else |
|
- | 46 | __asm__ volatile ("decl (%0)\n" : : "r" (val)); |
|
- | 47 | #endif /* __SMP__ */ |
|
- | 48 | } |
|
- | 49 | ||
- | 50 | static inline int test_and_set(int *val) { |
|
- | 51 | int v; |
|
- | 52 | ||
- | 53 | __asm__ volatile ( |
|
- | 54 | "movl $1, %0\n" |
|
- | 55 | "xchgl %0, (%1)\n" |
|
- | 56 | : "=r" (v) |
|
- | 57 | : "r" (val) |
|
- | 58 | ); |
|
- | 59 | ||
- | 60 | return v; |
|
- | 61 | } |
|
- | 62 | ||
36 | 63 | ||
37 | extern int test_and_set(int *val); |
- | |
38 | extern void spinlock_arch(int *val); |
64 | extern void spinlock_arch(int *val); |
39 | 65 | ||
40 | #endif |
66 | #endif |